当我研究一些复杂源码(比如Hibernate)的时候,常常需要程序运行期,某个变量的状态是什么。
通常做法是导入Hibernate的源码,编译,然后加断点或者System.out。
可是,导入源码常常是很麻烦,源码量也大,我只是为了看一个变量状态,至于这么麻烦吗。
这个时候javassist工具就可以帮忙了。
曾经大致的比较了一下这类工具:cglib/asm/javassist
cglib基于asm是干不了这个的,因为所有需要修改的对象都必须enhance过。
asm当然可以干这个,不过我必须理解诸如:
ALOAD 0
ILOAD 1
ACONST_NULL
之类的指令,太累了。
在看看javassit,功能不够强大,但是正好够用!
这段代码的含义很简单:
在org.hibernate.impl.SessionImpl类的save(Object object)方法的第0行插入:
System.out.println("执行SessionImpl.save");
如果此方法参数是简单类型,只需要ClassPool.getDefault().getCtClass("boolean")就可以
这样,可以随便在以存在的class里加入任何代码,以达到调试代码的目的