系列文章目录
01 在方法体的开头或结尾插入代码
 02 使用Javassist实现方法执行时间统计
 03 使用Javassist实现方法异常处理
 04 使用Javassist更改整个方法体
 05 当有指定方法调用时替换方法调用的内容
 06 当有构造方法调用时替换方法调用的内容
 07 当检测到字段被访问时使用语句块替换访问
 08 当检测到对象(不包括数组)创建时用代码块替换
 09 当检测到对象(不包括数组)创建时用代码块替换
 10 当检测到instanceof表达式时用代码块替换
 11 当检测到显示类型转换时用代码块替换
 12 当检测到catch语句时在catch前插入代码
 13 使用Javassist获取注解
文章目录
- 系列文章目录
- 前言
- 引入Javassist jar包
- 使用Javassist获取注解
 
- 总结
前言
上一章我们介绍了当检测到catch语句时在catch前插入代码,学习了 method.instrument的用法。以及参数为Handler的重载方法edit的含义。本章主要介绍使用Javassist获取注解。
引入Javassist jar包
在上几篇文章已经引入了javassist的jar包,如果你是第一次观看本系列文章,也可以复制以下maven依赖将jar包导入工程。
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.28.0-GA</version>
        </dependency>
使用Javassist获取注解
/**
 * 【Javassist】快速入门系列13 当检测到显示类型转换时用代码块替换
 * 公众号&B站:精致的王同学
 * @author 精致的王同学
 * @date 2023/1/1 0:51
 */
public class Basic13Annotation {
    public static void main(String[] args) throws Exception{
        // 获取javassist默认类池
        ClassPool pool = ClassPool.getDefault();
        // 获取basic.Basic13Test的ctClass对象
        CtClass ctClass = pool.get("basic.Basic13Test");
        // 获取其doService方法
        CtMethod method = ctClass.getDeclaredMethod("doService");
        // 获取其basic.annotations.Validator注解
        Validator annotation = (Validator)method.getAnnotation(Validator.class);
        //  method.getAnnotations()方法获取指定方法上全的注解数组
        Object[] annotations = method.getAnnotations();
        Validator annotation1 = (Validator)annotations[0];
        System.out.println("annotation:"+annotation.name());
        System.out.println("annotation1:"+annotation1.name());
    }
}
以上Basic13Annotation 类创建了一个main方法,该方法中首先获取javassist的类池pool,然后调用pool.get(“basic.Basic13Test”)方法获取到basic包下的Basic13Test类。Basic13Test类源码如下:
/**
 * 第12节测试类
 * 公众号&B站:精致的王同学
 * @author 精致的王同学
 * @date 2022/12/28 17:54
 */
public class Basic13Test {
    @Validator(name = "ageValidator")
    public void doService(HashMap<String,Object> paramsMap) {
        //参数校验...
        // 业务代码
        System.out.println("doservice");
    }
}
该类中有一个doService方法,在屏幕上输出doservice。
回到Basic13Annotation的main方法,在获取到Basic13Test类的ctClass的对象之后,获取其doService方法的方法对象。
接着调用method.getAnnotation(Validator.class)方法获取方法上的Validator类型的注解。然后调用method.getAnnotations()方法获取指定方法上全的注解数组。获取数组的第一个元素。
由于doService方法上只有Validator一个注解。所以method.getAnnotations()获取的注解数组只有一个元素就是Validator注解。
该注解源码如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Validator {
    String name();
}
该注解有一个属性name,Basic13Annotation 中在获取到注解后分别打印注解的属性值。
 Basic13Annotation的main方法结果如下:
 
总结
本篇文章介绍了如何使用Javassist获取注解。是除了反射获取注解外的另一种方式。







![[OC学习笔记]启动流程(objc部分)](https://img-blog.csdnimg.cn/b0e7d21595204eea96585eb17c2fac56.png)
![洛谷—— AT_abc157_a [ABC157A] Duplex Printing](https://img-blog.csdnimg.cn/img_convert/7730345e4e6730b0e09cdfe3c0b17e15.png)










