动机
前两天在项目中遇到了一个关于webflow的问题。在访问页面时,老是提示无法找到流转节点。后来跟源码发现webflow在记录流转节点的时候做了个数限制,最多只能存5个流转节点。于是怀疑时跳转判断流程太多,导致原来存储的流转节点被后来新生成的流转节点覆盖了(后来发现不是)。于是想修改webflow记录的流程节点个数限制。那么问题来了,这个东西并没有在Spring里面配置,而是直接写在代码里面了,只能通过修改Class文件来修改个数限制。于是找出了Javasssist这个神器。
用法
1引入要修改的class文件所在的jar包
修改引入javassist的jar包
修改代码
public static void main(String[] args) throws InvalidByteCodeException, IOException, NotFoundException, CannotCompileException { ClassPool pool = ClassPool.getDefault(); //读取要修改的class文件 CtClass cc = pool.get("org.springframework.webflow.conversation.impl.SessionBindingConversationManager"); //拿到要修改的方法 CtMethod m = cc.getDeclaredMethod("beginConversation"); //在这个方法前增加语句,设置个数为-1(其实就是不做个数限制) m.insertBefore("setMaxConversations(-1);"); //拿到要修改的方法 m = cc.getDeclaredMethod("getConversationContainer"); //在这个方法前增加语句,设置个数为-1(其实就是不做个数限制) m.insertBefore("setMaxConversations(-1);"); //将文件写到本地 cc.writeFile("G:\\SessionBindingConversationManager.class"); }
总结
修改不仅可以修改已经生成的class文件(包括新增方法,修改方法等),还可以生成class文件,可以说是非常方便的,在我们写代码遇到瓶颈,或者在排查现场问题,而又缺失源码的时候,不妨可以试一试。