用javassist调试程序

来源:互联网 发布:新浪国际足球数据库 编辑:程序博客网 时间:2024/06/08 11:18

当我研究一些复杂源码(比如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里加入任何代码,以达到调试代码的目的

原创粉丝点击