2012-03-18 13 views

答えて

4

生成されたバイトコードを解析する場合にのみ実行できます。あなたは私の知る限り、あなたの例では、ここでは、オブジェクトのフィールドを使用するコードサンプルはJavassistのと、プリント指定したクラスのメソッドによって使用されるすべてのフィールドを使用している理解しているので、バイトコードエンジニアリングライブラリ、例えば、ASM、Javassistのなど

を使用することができます。

ClassFile cf = new ClassFile(new DataInputStream(className + ".class"))); 
for (Object m : cf.getMethods()) { 
    MethodInfo minfo = (MethodInfo)m; 
    CodeAttribute ca = minfo.getCodeAttribute(); 
    for (CodeIterator ci = ca.iterator(); ci.hasNext();) { 
     int index = ci.next(); 
     int op = ci.byteAt(index); 
     if (op == Opcode.GETYFIELD) { 
        int a1 = ci.s16bitAt(index + 1); 
        String fieldName = " " + cf.getConstPool().getFieldrefName(a1); 
      System.out.println("field name: " + fieldName); 
     } 
    } 

}

4

それはあなたがコンパイル時にデバッグ情報が有効になっているかどうかによって異なります。そうでない場合は、変数名を破棄し、単にスタックアドレス参照によって参照されます。通常、これを行うにはコンパイラに "-g"オプションを与えますが、Mavenを使用している場合は、それが有効になっているかどうかを確認するためのマニュアルをチェックしてください。

デバッグが有効になっている場合は、この情報を見つけるためにBCELなどのライブラリを使用することができます。

java.lang.reflect.Method javaMethod = ...; // lookup the actual method using reflection 
org.apache.bcel.classfile.JavaClassjc = org.apache.bcel.Repository.lookupClass(classname); 
org.apache.bcel.classfile.Method method = jc.getMethod(javaMethod); 
org.apache.bcel.classfile.LocalVariableTable lvt = method.getLocalVariableTable(); 

そこから、LocalVariableTableは(BCELのマニュアルを参照してくださいローカル変数のリストを取得する方法がたくさんあります)。

これを行うことができるいくつかのパッケージがありますが、BCELとJavassistは私の頭の上から気になります。

関連する問題