代码之家  ›  专栏  ›  技术社区  ›  Amir Afghani

方法入口/出口的ASM字节码检测

  •  1
  • Amir Afghani  · 技术社区  · 15 年前

    • onClassLoadHook将加载类的字节码发送到一个单独的Java进程,该进程将使用ASM对该类进行检测

    • 把字节码取回来并加载

    .. ..

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

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

    有人能告诉我我是不是做错了什么吗?我唯一的线索是,如果我不把这个指针作为参数传递给我的函数,而是传递原语类型,那么一切都会完成。这个指针有什么特别的地方需要我管理吗?我比较了字节码,并使用asmiger获得了生成正确字节码所需语句的线索。

    2 回复  |  直到 14 年前
        1
  •  1
  •   McDowell rahul gupta    15 年前

    super.visitCode() ?

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

    TraceClassVisitor 以准确检查生成的内容。

        2
  •  1
  •   JZeeb    15 年前

    看起来您的代码是正确的,使用mv.visitCode()。javap显示预期的字节码。我猜你原来的反编译器做得不对。