Eclipse下Javassist正确使用方法代码解析
作者:三向板砖 时间:2021-07-24 18:43:57
这两天看到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。
来源:http://blog.csdn.net/shuzhe66/article/details/39319121
标签:eclipse,javassist
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java读取、写入文件如何解决乱码问题
2023-08-26 11:16:00
java中使用数组进行模拟加密的方法
2023-11-18 15:37:39
java 请求跨域问题解决方法实例详解
2023-08-24 02:55:11
java排序算法之冒泡排序
2023-04-05 21:03:42
![](https://img.aspxhome.com/file/2023/7/72637_0s.gif)
SpringBoot详细讲解静态资源导入的实现
2023-07-26 13:23:21
![](https://img.aspxhome.com/file/2023/8/57728_0s.png)
c# AcceptEx与完成端口(IOCP)结合的示例
2023-07-29 01:46:24
TKmybatis的框架介绍和原理解析
2022-08-28 21:35:42
关于EntityWrapper的in用法
2023-11-29 09:02:11
![](https://img.aspxhome.com/file/2023/3/60353_0s.png)
计算字符串和文件MD5值的小例子
2023-12-10 20:31:19
C# WinForm制作登录界面的实现步骤
2022-09-06 18:32:54
![](https://img.aspxhome.com/file/2023/7/68607_0s.png)
解决Android软键盘弹出覆盖h5页面输入框问题
2023-06-19 11:33:24
![](https://img.aspxhome.com/file/2023/7/83547_0s.jpg)
SpringBoot 过滤器 Filter使用实例详解
2021-11-08 13:46:00
使用SSM+Layui+Bootstrap实现汽车维保系统的示例代码
2023-11-28 18:30:04
![](https://img.aspxhome.com/file/2023/6/60416_0s.jpg)
springboot集成mybatisplus的方法
2022-08-02 16:35:12
![](https://img.aspxhome.com/file/2023/9/64479_0s.png)
spring使用OXM进行对象XML映射解析
2022-11-11 16:05:19
![](https://img.aspxhome.com/file/2023/1/60661_0s.jpg)
Java中joda日期格式化工具的使用示例
2023-03-01 11:49:10
Netty分布式pipeline管道异常传播事件源码解析
2021-08-15 16:12:02
SpringMVC Interceptor拦截器使用教程
2022-05-11 02:17:22
![](https://img.aspxhome.com/file/2023/8/67098_0s.png)
SpringBoot整合OpenApi的实践
2023-08-03 11:59:55
![](https://img.aspxhome.com/file/2023/8/70578_0s.jpg)
Java 入门图形用户界面设计之复选框
2022-06-19 15:22:53
![](https://img.aspxhome.com/file/2023/0/60540_0s.png)