如果可以反射方法返回值类型,参数列表。
没理由不能反射方法体。
而且也有像jad这样的程序,说明可以实现class的2进制码->源代码。
所以,为啥呢

解决方案 »

  1.   

    反射是反射类的基本信息反射与反编译是有区别的如果需要操作方法体的话,那需要掌握 JVM 指令,一般可以使用 ASM 这个工具进行操作,不过很复杂。
      

  2.   

    感谢回复,反射在runtime 时用类加载器加载一个类的元数据,而方法体并没有被当作元数据。所以此过程没有反编译,grand。
    但如果方法体是元数据的话,就可以直接像 修改 modifier 或 增加instance variable 那样instrument the method,这个和用ASM or JLI instruments method body 就一样吧。请问获取元数据的过程一点反编译也没有吗?毕竟读入参数是一个.class文件。
      

  3.   

    接贴:
    我们得到的元数据,是原始class的副本,所以对副本的改变并没有影响.class文件本身。
    假设
    Instruction[] Instructions = methodA.getMethodBody().getByteCode();
    ..manipulate bytecode..
    invoke the instrumented methodstraightforward than JLI isnt it?
    只是想问问这样的可行性是不是存在,至于sun为什么不这么做,肯定有他们的道理。
      

  4.   

    1.获取元数据直接从class文件中就可以解析出来了。建议读一下class文件格式。
    2.要得到方法体的话,需要的是反编译知识,虽然通过中间代码得到源代码比从可执行程序得到要容易很多,但也很难做到完全的一致,还不提故意混淆的情况。这个你可以用jad去试验。
    3.得到方法代码有啥意义吗?
      

  5.   

    受教了!
    其实得到汇编码就可以了,源代码确实没太大用。在汇编码添加些拦截,报告,计算。我想是不是reflection能反射出方法的汇编码,反正都读一遍class了,
    在class的method_info结构体里加个指针指向method initial address不行吗。
      

  6.   

    通过Class得到Method,然后可以invoke(当然要找到方法指令集),lz的问题其实已经解决了