特定のJavaメソッドで使用されている変数を判別する方法はありますか?私は次のメソッドを持っている場合Javaメソッド内で使用されている変数を識別する方法はありますか?
はたとえば、:
public void getResult(){
int result = value1 + value2;
}
は、それから私は、名前が結果をvalue1とvalue2を含むリストを必要とします。
特定のJavaメソッドで使用されている変数を判別する方法はありますか?私は次のメソッドを持っている場合Javaメソッド内で使用されている変数を識別する方法はありますか?
はたとえば、:
public void getResult(){
int result = value1 + value2;
}
は、それから私は、名前が結果をvalue1とvalue2を含むリストを必要とします。
生成されたバイトコードを解析する場合にのみ実行できます。あなたは私の知る限り、あなたの例では、ここでは、オブジェクトのフィールドを使用するコードサンプルは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);
}
}
}
それはあなたがコンパイル時にデバッグ情報が有効になっているかどうかによって異なります。そうでない場合は、変数名を破棄し、単にスタックアドレス参照によって参照されます。通常、これを行うにはコンパイラに "-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は私の頭の上から気になります。