时间:2021-05-20
这两天看到Hibernate的代理部分,第一反应是底层使用了反射,针对用户实体生成了代理类,后来反应过来了,反射没有任何可以产生新类的能力,也就顺理成章地找到了Javassist(下载地址)。
在网上搜索到的大部分教程,都是针对Javassist的API进行一番讲解,但是最后,往往没有一个加载过程,而笔者模仿这些教程进行类的加载时,加载到的结果都是原来的类,并没有产生字节码被修改的内容。
在经过一番探索后,笔者发现,网上的大部分教程中的最后一步,保存字节码,使用的均是writeFile的无参数重载,在查看其函数结构后发现,它还有一个String类型的重载,由于在Eclipse下,字节码储存的根位置并不是”.\\”而是”.\\bin”,而writeFile的另一个重载很可能是指定字节码根位置的参数,笔者进行一番更改后发现,果不其然。
下面将演示代码分享出来:
这是笔者项目的结构:
Editable.java: package com.thrblock.javassist; public class Editable { public void showInfo(){ System.out.println("InfoDefault!"); } } Main.java: package com.thrblock.javassist;import java.io.IOException;import javassist.CannotCompileException;import javassist.ClassPool;import javassist.CtClass;import javassist.CtMethod;import javassist.CtNewMethod;import javassist.NotFoundException;public class Main { public static void main(String[] args) { ClassPool pool = ClassPool.getDefault(); try{ pool.insertClassPath(".\\bin"); //设置根路径。(这里设置的根路径显然没被writeFile使用) CtClass cc = pool.makeClass("com.thrblock.javassist.EditableChanged"); //模拟Hibernate代理模式,我们创建一个新类 cc.setSuperclass(pool.get("com.thrblock.javassist.Editable")); //设置其父类 CtMethodcm = CtNewMethod.make("public void showInfo(){super.showInfo();System.out.println(\"CustomInsertHAHA!\");}",cc); //追加一个方法,注意它覆盖了父类中的方法。 cc.addMethod(cm); cc.writeFile(".\\bin"); //这里比较重要,空参的结果就是没有保存到eclipse字节码根路径里。 } catch (NotFoundException | CannotCompileException | IOException e) { e.printStackTrace(); } try{ Class<?> cl = Class.forName("com.thrblock.javassist.EditableChanged"); //加载我们的新类 Editableed = (Editable) cl.newInstance(); //由于其继承与Editable类,这里和Hibernate里的load道理一样。 ed.showInfo(); //调用方法。 } catch (ClassNotFoundException | InstantiationException |IllegalAccessException e) { e.printStackTrace(); } }}打印结果:
InfoDefault!
CustomInsertHAHA!
其他注意事项:
由于我们是生成了一个类,如果这个类名和原类名一样,则会覆盖class文件,但是如果修改之前该class已经被JVM装入,则修改的部分不会生效,必须重启JVM。
总结
以上就是本文关于Eclipse下Javassist正确使用方法代码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,使用方法:复制代码代码如下:frompyqueryimportPyQueryas
这篇文章主要介绍了pythonubplot使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下matl
这篇文章主要介绍了python循环嵌套的多种使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下使用循
这篇文章主要介绍了GTKtreeview原理及使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下Gt
这篇文章主要介绍了pythonzip()函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下参数i