使用javassist对类做字节码增强

业务背景

在日常开发中我们依赖的三方库里的类是无法改动的. 但可以使用javassist 在启动时对类的字节码做改动.达到修改类的作用

实现方式

java 复制代码
@Slf4j
public class JeeSiteJavassistShiroByteCode {

    public static void install() {
        try {
            ClassPool pool = ClassPool.getDefault();
            CtClass cc = pool.get("com.jeesite.common.mybatis.mapper.xmltags.IiIiiiiIiiiI");
            cc.defrost();
            CtMethod m = cc.getDeclaredMethod("doGetAuthenticationInfo");
            CtMethod m2 = cc.getDeclaredMethod("getAuthorizationInfo");
            m.insertAfter("{ System.out.println(\"doGetAuthenticationInfo: \"+com.alibaba.fastjson.JSONObject.toJSONString($_)+\"  :   \"+com.alibaba.fastjson.JSONObject.toJSONString($1)); }");
            m2.insertAfter("{ System.out.println(\"getAuthorizationInfo: \"+com.alibaba.fastjson.JSONObject.toJSONString($_)+\"  :   \"+com.alibaba.fastjson.JSONObject.toJSONString($1)); }");
            cc.writeFile(".");
            cc.toClass();
        } catch (Exception e) {
            log.error("bytecode modify failed.", e);
        }
    }
}

利用javassist 可以将方法的入参和返回值打印出来.

启用javassist

java 复制代码
   public static void main(String[] args) {
        JeeSiteJavassistShiroByteCode.install();
        SpringApplication.run(MesApplication.class, args);
    }

在启动之前对类的字节码做修改

相关推荐
深蓝轨迹31 分钟前
@Autowired与@Resource:Spring依赖注入注解核心差异剖析
java·python·spring·注解
不想看见40432 分钟前
C++八股文【详细总结】
java·开发语言·c++
huaweichenai1 小时前
java的数据类型介绍
java·开发语言
weisian1511 小时前
Java并发编程--17-阻塞队列BlockingQueue:生产者-消费者模式的最佳实践
java·阻塞队列·blockqueue
奔跑的呱呱牛1 小时前
GeoJSON 在大数据场景下为什么不够用?替代方案分析
java·大数据·servlet·gis·geojson
爱丽_1 小时前
Pinia 状态管理:模块化、持久化与“权限联动”落地
java·前端·spring
luom01022 小时前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 骨科术后营养餐推荐系统为例,包含答辩的问题和答案
java
丶小鱼丶2 小时前
数据结构和算法之【栈】
java·数据结构
希望永不加班2 小时前
SpringBoot 核心配置文件:application.yml 与 application.properties
java·spring boot·后端·spring