2016-10-06 17 views
0

私はcassandraドライバを計測しようとしています。特に、いくつかの情報に掛かるようにResultSetクラスを変更する必要があります。これを行うには、インスタンスが割り当てられているコードを変更する必要があります。これは別のクラスの静的メソッドです。このコードには次のスニペットが含まれています。AdviceAdapter onMethodExitはまだ呼び出されていません

return r.metadata.pagingState == null 
    ? new SinglePage(columnDefs, tokenFactory, protocolVersion, columnDefs.codecRegistry, r.data, info) 
    : new MultiPage(columnDefs, tokenFactory, protocolVersion, columnDefs.codecRegistry, r.data, info, r.metadata.pagingState, session); 

また、メソッド内に他の戻り値があります。だから、私の考えは、このメソッドでAdviceAdapterを使い、onMethodExit()を使うことでした。しかし、私の方法は決して呼び出されませんでした。それ以来、方法は戻ってきています。ちょっとデバッグした後、私はAdviceAdapterクラスのvisitInsn()がIALOADのオペコード(配列からintをロードする)で一度だけ呼び出されていることがわかりました。

私の質問は、おそらく何が起こっているのでしょうか?こんにちは。申し訳ありませんが、私の机の上で私の頭を今日何度も何度も骨折りました。

EDIT:私のクラスを単純なMethodVisitorに変更して、さらに多くのオペコードが表示されるかどうかを確認しました。私はそれをすべて見ます!私はもはやdup()にアクセスできなくなりました。私は私のプロジェクトの一つに(のjavax /メール/交通用)EmailAdviceAdaptorを使用していた

+1

'dup()'だけが必要な場合は、単純な 'visitInsn(Opcodes.DUP)'の短縮形についてはあまり気にしませんが、 'GeneratorAdapter'だけが必要です。あなたのカスタム訪問者が 'GeneratorAdapter'または' AdviceAdapter'をラップするようにします。あなたの訪問者が 'AdviceAdapter'のサブタイプであるASMにはこのタイプに関する特別なケースはありません。たぶんあなたはそれを妨害する方法でいくつかの他のメソッドをオーバーライドしましたか? – Holger

+0

こんにちは。私はGeneratorAdapterを試してみましたが、最初のOpCodeだけを見ました。私はこの時点で他の方法をオーバーライドしておらず、他の訪問者をこのクラスにも適用していません。それはすべてかなり奇妙です。多分日食がどうにかして起こっているのだろうか?コマンドラインからテストを実行して、何かがうまく動作するかどうかを確認します。 – ticktock

答えて

0

:(、コードは以下のとおりである。このコードはあなたの問題を解決するのに役立ちます願っています。

package com.mail.agent.adapter; 

import com.mail.jtm.BTMConstants; 
import com.mail.org.objectweb.asm.Label; 
import com.mail.org.objectweb.asm.MethodVisitor; 
import com.mail.org.objectweb.asm.Opcodes; 
import com.mail.org.objectweb.asm.Type; 
import com.mail.org.objectweb.asm.commons.AdviceAdapter; 

public class MyEmailAdviceAdapter extends AdviceAdapter { 

private String methodName; 
private String className; 
private String description; 

private static final String MAIL_SEND_METHOD1_DESC="(Ljavax/mail/Message;)V"; 
private static final String MAIL_SEND_METHOD2_DESC="(Ljavax/mail/Message;[Ljavax/mail/Address;)V"; 
private static final String MAIL_SENDMESSAGE_METHOD_DESC="(Ljavax/mail/Message;[Ljavax/mail/Address;)V"; 

private boolean isSendMethod; 

private int okFlag = newLocal(Type.BOOLEAN_TYPE); 
Label startFinally = new Label(); 

public MyEmailAdviceAdapter(int access , MethodVisitor mv , String methodName, String description, String className, int classFileVersion){ 
    super(Opcodes.ASM5 , mv, access, methodName, description); 
    this.className = className; 
    this.methodName = methodName; 
    this.description = description; 
    this.isSendMethod = false; 

    if(methodName.equals("send")){ 
     if(description.equals(MAIL_SEND_METHOD1_DESC) || description.equals(MAIL_SEND_METHOD2_DESC)){ 
      isSendMethod = true; 
     } 
    } 
    else if(methodName.equals("sendMessage") && description.equals(MAIL_SENDMESSAGE_METHOD_DESC)){ 
     isSendMethod = true; 
    } 
} 

public void visitCode() { 
    super.visitCode(); 
    mv.visitLabel(startFinally); 
} 

protected void onMethodEnter(){ 
    if(isSendMethod) { 
     mv.visitInsn(Opcodes.ICONST_0); 
     mv.visitVarInsn(ISTORE, okFlag); 

     mv.visitVarInsn(Opcodes.ALOAD, 0); 
     mv.visitLdcInsn(className); 
     mv.visitLdcInsn(methodName); 
     mv.visitLdcInsn(description); 
     mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/mail/agent/trace/MailTracer", "mailMethodBegin", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z"; , false); 
     mv.visitVarInsn(ISTORE, okFlag); 
    } 
} 

protected void onMethodExit(int opcode){ 
    if(opcode!=ATHROW) { 
     onFinally(opcode); 
    } 
} 

public void visitMaxs(int maxStack, int maxLocals){ 
    Label endFinally = new Label(); 
    mv.visitTryCatchBlock(startFinally, endFinally, endFinally, null); 
    mv.visitLabel(endFinally); 
    onFinally(ATHROW); 
    mv.visitInsn(ATHROW); 
    mv.visitMaxs(maxStack, maxLocals); 
} 

private void onFinally(int opcode){ 
    if(isSendMethod){ 
     // If the method throws any exception 
     if(opcode == ATHROW){ 
      mv.visitInsn(Opcodes.DUP); 
      mv.visitLdcInsn(className); 
      mv.visitLdcInsn(methodName); 
      mv.visitLdcInsn(description); 
      mv.visitVarInsn(ILOAD, okFlag); 
      mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/mail/agent/trace/MailTracer", "recordException", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V", false); 
     } 
     mv.visitLdcInsn(className); 
     mv.visitLdcInsn(methodName); 
     mv.visitLdcInsn(description); 
     mv.visitVarInsn(ILOAD, okFlag); 
     mv.visitLdcInsn(opcode); 
     mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/mail/agent/trace/MailTracer", "mailMethodEnd", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZI)V", false); 
    } 
} 

}

関連する問題