Eclipse下Javassist正确使用方法代码解析

作者:三向板砖 时间:2021-07-24 18:43:57 

这两天看到Hibernate的代理部分,第一反应是底层使用了反射,针对用户实体生成了代理类,后来反应过来了,反射没有任何可以产生新类的能力,也就顺理成章地找到了Javassist(下载地址)。

在网上搜索到的大部分教程,都是针对Javassist的API进行一番讲解,但是最后,往往没有一个加载过程,而笔者模仿这些教程进行类的加载时,加载到的结果都是原来的类,并没有产生字节码被修改的内容。

在经过一番探索后,笔者发现,网上的大部分教程中的最后一步,保存字节码,使用的均是writeFile的无参数重载,在查看其函数结构后发现,它还有一个String类型的重载,由于在Eclipse下,字节码储存的根位置并不是”.\\”而是”.\\bin”,而writeFile的另一个重载很可能是指定字节码根位置的参数,笔者进行一番更改后发现,果不其然。

下面将演示代码分享出来:

这是笔者项目的结构:

Eclipse下Javassist正确使用方法代码解析


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
0
投稿

猜你喜欢

  • 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
  • SpringBoot详细讲解静态资源导入的实现

    2023-07-26 13:23:21
  • c# AcceptEx与完成端口(IOCP)结合的示例

    2023-07-29 01:46:24
  • TKmybatis的框架介绍和原理解析

    2022-08-28 21:35:42
  • 关于EntityWrapper的in用法

    2023-11-29 09:02:11
  • 计算字符串和文件MD5值的小例子

    2023-12-10 20:31:19
  • C# WinForm制作登录界面的实现步骤

    2022-09-06 18:32:54
  • 解决Android软键盘弹出覆盖h5页面输入框问题

    2023-06-19 11:33:24
  • SpringBoot 过滤器 Filter使用实例详解

    2021-11-08 13:46:00
  • 使用SSM+Layui+Bootstrap实现汽车维保系统的示例代码

    2023-11-28 18:30:04
  • springboot集成mybatisplus的方法

    2022-08-02 16:35:12
  • spring使用OXM进行对象XML映射解析

    2022-11-11 16:05:19
  • Java中joda日期格式化工具的使用示例

    2023-03-01 11:49:10
  • Netty分布式pipeline管道异常传播事件源码解析

    2021-08-15 16:12:02
  • SpringMVC Interceptor拦截器使用教程

    2022-05-11 02:17:22
  • SpringBoot整合OpenApi的实践

    2023-08-03 11:59:55
  • Java 入门图形用户界面设计之复选框

    2022-06-19 15:22:53
  • asp之家 软件编程 m.aspxhome.com