我創建了一個JVMTI代理,做以下處於較高水平:ASM字節碼儀器儀表/出口
onClassLoadHook爲加載的類的字節碼發送到一個單獨的Java過程儀表類使用ASM
得到字節碼回並加載它們
在我的獨立的java進程,儀器加載Java類我做次E採用:
.. ..
cr = new ClassReader(inBytes, offset, inLen);
cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
ClassAdapter ca = new ClassAdapter(cw) {
..
..
@Override
public MethodVisitor visitMethod(final int access,
final String name,
final String desc,
String signature,
String[] exceptions) {
return new MethodAdapter(mv) {
@Override
public void visitCode() {
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/amir/Tester", "callTestStatic3", "(Ljava/lang/Object;)V");
mv.visitCode();
}
}
}
當我嘗試反編譯是使用Java反編譯該儀器後寫的類 - 我看到了下面的反編譯功能,我知道錯了:
public void func1(int arg1, int arg2)
{
int b;
Tester.callTestStatic3(???);
System.out.println("arg = " + a + " b = " + b);
}
,因爲我的功能其實是這樣的:
public void func1(int a, int b)
{
System.out.println("arg = " +a + " b = " +b);
}
任何人都可以告訴我,如果我在這裏做錯了什麼?我唯一的線索是,如果不是作爲參數傳遞給我的函數THIS指針,如果我傳入基本類型,則所有東西都可以運行。對於我需要管理的THIS指針有什麼特別之處?我已經比較了字節碼,並且我使用ASMIFIER來了解我需要使用什麼語句來生成正確的字節碼。
感謝您的回覆。事實證明你是對的,反編譯器是免費的,而不是最大的指標。自寫這個原始線程以來,我開始使用JAD反編譯器,這看起來很可靠。 – 2009-08-22 06:02:50