经常看到OpenJPA、Jacoco、cobertura等工具对Java Class进行Instrument操作, Java 从1.5开始也提供了instrument包,那么到底什么是instrument,为什么instrument,怎么instrument呢?
什么是instrument
平时我们写Java程序,都是编写**.java 文件,通过Javac编译成Java Class文件,Java Class文件直接被JVM load到内存中运行。我们是不会去修改Class文件的内容。如果我们发现有要修改的内容,我们要修改java文件然后重新编译生成新的class文件,而Instrument就是对Java Class文件进行修改。
为什么instrument
这个就很简单了,比较常见的应用就是提取通用功能,可以说成是一种AOP,我一般通用功能分两种:怎么instrument
1. 使用asm/BCEL/javassist在JVM load class之前修改class文件,具体每种的实现可以参考reference里面各个的user guide,在Java1.5之前,大部分对class文件的修改都是直接使用这些三方包,比如AspectJ,比如cobertura
Reference:
1. asm: http://asm.ow2.org/ BCEL: http://commons.apache.org/proper/commons-bcel/index.html javasist: http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/
2. cobertura Instrument implementation:
https://github.com/cobertura/cobertura/blob/master/cobertura/src/main/java/net/sourceforge/cobertura/instrument/InstrumentMain.java
https://github.com/cobertura/cobertura/blob/master/cobertura/src/main/java/net/sourceforge/cobertura/dsl/Cobertura.java
https://github.com/cobertura/cobertura/blob/master/cobertura/src/main/java/net/sourceforge/cobertura/instrument/CodeInstrumentationTask.java
https://github.com/cobertura/cobertura/blob/master/cobertura/src/main/java/net/sourceforge/cobertura/instrument/CoberturaInstrumenter.java instrumentClass(InputStreaminputStream)
原文:http://blog.csdn.net/cloud_ll/article/details/18732449