我已经创建了一个JVMTI剂,并以下在高级别:

  • onClassLoadHook送字节的装类为一个独立的Java进程,将仪器类使用ASM

  • 得到的字节来回载他们

在我的单独的java进程,文书中所载Java class我做到以下几点:

.. ..

    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);

}

谁能告诉我如果我做错了什么在这里?我唯一的线索是,如果而不是通过在作为一个参数以我的功能的这一指针,如果我通过在基本类型,一切工作的出finie.是不是有什么特别的有关这一指针,我需要管理?我比较字节,和我已经使用ASMIFIER得到一个线索是什么样的发言,我需要使用产生的权字节代码。

有帮助吗?

解决方案

它看起来像你的代码是否正确,与mv。visitCode().javap显示了预期字节代码。我猜你原来的反编译器只是不是在做正确的事情。

其他提示

也许它并不重要,但是你不是应该叫 super.visitCode()?

@Override
public void visitCode() {
  super.visitCode();
  ...

我会用 TraceClassVisitor 检查什么,正在产生。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top