解析一个.class文件,然后给该class文件对象的类里的方法参数赋值,要解析传入这些参数使该方法走了哪些具体的分支。
本人想法的是:在每个分支的地方插入装置变量如一个log。。通过记录日志的方法记录每个分支。。
例子:public void re(int a,int b){
      if(a>b){  //分支一
      ....在这里记录log1中(装置变量)
       .........
     }else{   //分支二
         log2....(装置变量)
         .......
     }
}
问题:我现在是要解析别人的.class文件,用反射是做不到向方法内插入装置变量的,换句话说我怎么在别人的类的方法分支处插入装置变量?请教各位高手,谁能赐教一下,十分感谢。

解决方案 »

  1.   

    这个用 AOP 实现不了的吧,AOP 不可能在 if 分支里插入语句吧。
      

  2.   

    这个得修改 .class 文件的字节码了,非常麻烦的,比较好的工具有:ASM, BCEL, SERP, javassist。
    但是使用这些工具修改字节码得对 JVM 指令集有相当的了解。
      

  3.   

    要插入“装置变量”开始理解就是写入日志。。一个java类文件编译成.class文件,执行方法分支的时候会触发jvm的一些汇编指令具体这些东西本人能力有限弄不出来,《深入java虚拟机》里有关于这个的介绍。但是后来想想要在.class文件里不用反编译插入log应该是实现不了的,因为一个是.class文件一个是log源代码,如果不用反编译很难实现的,但是用了反编译就没有意义了,不知道cobertura测试覆盖率是怎么实现它的,我看它源代码,但是很复杂很难懂,它用了很多第三方JAR上面有人提到过BCEL本人觉得应该是解决不了的,假如java要比反射机制还底层就必须有jni了,但是BCEL里没有native方法,估计做不到....还在研究中谢谢各位了。。
      

  4.   

    可以使用 ASM 修改字节码的啊,原来在 .class 中增加过几个属性,不过很麻烦。如果要在 if 的各分支插入的语句的话,
    那更麻烦,得先定位到需要插入的地方。像一些动态代码框架,比如 Cglib 就是使用 ASM 直接修改字节码的。可以到 ASM 的网站上去看看,有教程的,不过感觉很复杂。http://asm.objectweb.org/