Javassist动态修改Class对象

编程入门 行业动态 更新时间:2024-10-22 10:44:10

Javassist动态修改Class<a href=https://www.elefans.com/category/jswz/34/1771306.html style=对象"/>

Javassist动态修改Class对象

一、背景

上一篇文章 Java代理 讲了动态代理,JDK的Proxy动态代理是用反射机制来实现,而CGLIB是通过ASM操作字节码来实现,用ASM操作字节码比较复杂,需要熟悉Class文件结构,用Javassist也可以实现修改类对象,可以在一个已经编译好的类中添加新的方法或者修改已有的方法而不需要你对字节码文件有深入的了解,这个功能还是很强大,不仅服务端在做拦截时会用到,Android做热更新也可以用这个,唉,以前做了2年的Andoid现在差不多忘光了。

二、Javassist核心类介绍

CtClass:表示Class文件,一个CtClass对象可以处理一个Class文件,有addField、addMethod、addConstructor、writeFile(根据CtClass生成.class文件)、toClass(通过类加载器加载该CtClass)。

ClassPool: 是CtClass对象的容器,makeClass方法创建一个CtClass空类。

CtField:定义成员变量.

CtMethod:

insertBefore:在方法起始位置插入代码。
insterAfter:在方法return语句前插入代码。
insertAt: 在指定位置插入代码。
setBody:设置方法体。
make:新建一个方法。
//$0=this, $1,$2,$3... 代表方法参数
//这个表示法和Shell差不多
ctMethod.setBody("{$0.name = $1;}")

三、调用生成的类对象

1、通过反射调用

2、通过读取.class文件调用

四、修改一个类的方法

在方法前后加入日志输出,打印调用方法的参数值。

OrderService.java  原始类文件

ModifyOrderService.java 修改OrderService并用调用方法

五、动态创建类并调用

User.java 要建的类结构如下

调用createUser方法会在内存中创建User对象并且执行printName方法。

更多推荐

Javassist动态修改Class对象

本文发布于:2023-12-04 07:23:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1660175.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:对象   动态   Javassist   Class

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!