javassist动态给方法添加注解,动态给形参添加注解,动态给类添加注解

参考文档

这个写的挺全的,就是写的有点丑

javassist教程_不懂人情世故的博客-CSDN博客_java javassist转载 https://www.cnblogs.com/rickiyang/p/11336268.htmljavassist使用全解析Java 字节码以二进制的形式存储在 .class 文件中,每一个 .class 文件包含一个 Java 类或接口。Javaassist 就是一个用来 处理 Java 字节码的类库。它可以在一个已经编译好的类中添加新的方法,或者是修改已有的方法,并且不需要对字节码方面有深入的了解。同时也可以去生成一个新的类对象,通过完全手动的方式。. 使用 Javassist 创建一个https://blog.csdn.net/qq_42114504/article/details/123229026?spm=1001.2014.3001.5506

这个写的不多,但是实用

Javassist注解(Annotation)的使用:CXF WebService动态生成 - coshaho - 博客园设计一个对接系统,通过动态模型的增删改触发业务系统相应服务的调用。模型增删改方法动态发布为WebService服务。WebService服务采用CXF发布,动态类生成采用Javassist。由于Webhttps://www.cnblogs.com/coshaho/p/5105545.html

用来测试的类

最终结果

注:方法有参数,才会有参数注解

        //获取类池
        ClassPool classPool = ClassPool.getDefault();
        CtClass ctClass = null;
        try {
            //获取类
            ctClass = classPool.getCtClass("aa.bb.cc.AAAA");
            //获取方法
            CtMethod method = ctClass.getDeclaredMethod("bbb");

            ClassFile classFile = ctClass.getClassFile();
            ConstPool constPool = classFile.getConstPool();


            // 添加类注解
            AnnotationsAttribute bodyAttr = new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag);
            Annotation bodyAnnot = new Annotation(Controller.class.getName(), constPool);
            bodyAttr.addAnnotation(bodyAnnot);
            classFile.addAttribute(bodyAttr);

            // 添加方法注解
            AnnotationsAttribute methodAttr = new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag);
            Annotation methodAnnot = new Annotation(GetMapping.class.getName(), constPool);
            methodAttr.addAnnotation(methodAnnot);
            method.getMethodInfo().addAttribute(methodAttr);

            // 添加参数注解 注:参数注解,必须方法有参数才会生成
            ParameterAnnotationsAttribute parameterAtrribute = new ParameterAnnotationsAttribute(constPool, ParameterAnnotationsAttribute.visibleTag);
            Annotation paramAnnot = new Annotation(RequestBody.class.getName(), constPool);
            Annotation[][] paramArrays = new Annotation[1][1];
            paramArrays[0][0] = paramAnnot;
            parameterAtrribute.setAnnotations(paramArrays);
            method.getMethodInfo().addAttribute(parameterAtrribute);

            /*
            将修改后的CtClass加载至当前线程的上下文类加载器中,CtClass的toClass方法是通过调用本方法实现。需要注意的是一旦调用该方法,则无法继续修改已经被加载的class;
            通过类加载器加载该CtClass。
             */
            ctClass.toClass();
            //根据CtClass生成 .class 文件
            ctClass.writeFile("D:\\projectDemo\\swagger-aotu-demo\\silence-spring-auto\\src\\main\\java\\aa\\bb\\cc\\bb");
        } catch (Exception e) {
            e.printStackTrace();
        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silence丶你的名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值