字节码技术可以动态改变某个类的结构(添加/删除/修改  新的属性/方法)

关于字节码的框架有javassist,asm,bcel等

引入依赖

<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12..GA</version>
</dependency>

生成字节码

//创建字节码文件
public class CreateClass { public static void main(String[] args) throws CannotCompileException, NotFoundException, IOException {
ClassPool pool = ClassPool.getDefault();
// 1.创建user类
CtClass userClass = pool.makeClass("com.irish.entity.User");
// 2.创建name 和age属性
CtField nameField = CtField.make("private String name;", userClass);
CtField ageField = CtField.make("private Integer age;", userClass);
// 3.添加属性
userClass.addField(nameField);
userClass.addField(ageField);
// 4.创建方法
CtMethod nameMethod = CtMethod.make("public String getName() {return name;}", userClass);
// 5.添加方法
userClass.addMethod(nameMethod);
// 6.添加构造函数
CtConstructor ctConstructor = new CtConstructor(
new CtClass[] { pool.get("java.lang.String"), pool.get("java.lang.Integer") }, userClass); ctConstructor.setBody(" { this.name = name; this.age = age; }");
userClass.addConstructor(ctConstructor); // 生成class文件
userClass.writeFile("F:/test");
System.out.println("生成字节码,成功!");
} }

读取字节码后,对字节码新增方法,然后执行该方法

这里的User类要存在,UpdateClass 才可以读取出他的字节码后再修改

public class User {

    private String name;
private Integer age; }
//动态修改字节码文件
public class UpdateClass { @SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) {
try {
ClassPool pool = ClassPool.getDefault();
// 读取com.irish.User
CtClass userClass = pool.get("com.irish.User");
CtMethod method = new CtMethod(CtClass.voidType, "sum", new CtClass[] { CtClass.intType, CtClass.intType },
userClass);
method.setBody("{System.out.println(\"sun:\" + ($1 + $2));}");
// 添加方法
userClass.addMethod(method);
//将修改后的字节码写入到磁盘中,通过反编译工具,可以看到对类进行了修改
userClass.writeFile("F:/test");
// 动态执行方法
Class clazz = userClass.toClass();
Object newInstance = clazz.newInstance();
Method sumMethod = clazz.getDeclaredMethod("sum", int.class, int.class);
sumMethod.invoke(newInstance, , ); } catch (Exception e) {
e.printStackTrace();
}
} }

最新文章

  1. Fancybox丰富的弹出层效果
  2. js制作烟花效果
  3. 解决win7下PIL无法打开图片的问题
  4. 网络HTTP协议
  5. css 变量与javascript结合
  6. Oracle计算时间差表达式
  7. Java基础之在窗口中绘图——利用多态性使用鼠标自由绘图(Sketcher 7 with a crosshair cursor)
  8. 搭建高可用mongodb集群(转)
  9. javascript Array 方法学习
  10. (原)调用jpeglib对图像进行压缩
  11. Git 分支管理详解
  12. 将string当字节流使
  13. jquery给img添加按钮事件
  14. 导出excel记录
  15. JavaScript的数据结构和算法
  16. 给JS包写TypeScript用的类型申明文件
  17. mongoDB 小练习
  18. cordova打开文件系统插件的使用: cordova-plugin-file-opener2
  19. ReactNative: 搭建ReactNative开发环境
  20. Java学习笔记:注解Annotation

热门文章

  1. Go语言在国产CPU平台上应用前景的探索与思考
  2. IGC(Interleaved Group Convolutions)
  3. LeetCode 449. Serialize and Deserialize BST
  4. 洛谷 P2850 [USACO06DEC]虫洞Wormholes 题解
  5. 探索性数据分析(Exploratory Data Analysis,EDA)
  6. 第12组 Beta测试(5/5)
  7. linux服务器磁盘挂载
  8. 安装关系型数据库MySQL 安装大数据处理框架Hadoop
  9. SQL server 表结构转Oracle SQL脚本
  10. [转]JRebel 热部署激活教程