使用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);
    }

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

相关推荐
q***9441 天前
springboot接入deepseek深度求索 java
java·spring boot·后端
诗9趁年华1 天前
深入分析线程池
java·jvm·算法
百***06011 天前
SpringBoot的@Scheduled和@Schedules有什么区别
java·spring boot·spring
喵了几个咪1 天前
使用Bazel构建你的Kratos微服务
java·运维·微服务
千寻技术帮1 天前
50022_基于微信小程序同城维修系统
java·mysql·微信小程序·小程序·同城维修
野蛮人6号1 天前
黑马八股笔记
java
Charles_go1 天前
41、C#什么是单例设计模式
java·设计模式·c#
皮皮林5511 天前
别再只会 mvn install 了!深入拆解 Maven 插件核心原理
java·maven
百***49001 天前
SpringSecurity的配置
java
@老蝴1 天前
Java EE - 常见的死锁和解决方法
java·开发语言·java-ee