【Javassist】快速入门系列13 使用Javassist获取注解

系列文章目录

01 在方法体的开头或结尾插入代码
02 使用Javassist实现方法执行时间统计
03 使用Javassist实现方法异常处理
04 使用Javassist更改整个方法体
05 当有指定方法调用时替换方法调用的内容
06 当有构造方法调用时替换方法调用的内容
07 当检测到字段被访问时使用语句块替换访问
08 当检测到对象(不包括数组)创建时用代码块替换
09 当检测到对象(不包括数组)创建时用代码块替换
10 当检测到instanceof表达式时用代码块替换
11 当检测到显示类型转换时用代码块替换
12 当检测到catch语句时在catch前插入代码
13 使用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方法结果如下:
main方法结果

总结

本篇文章介绍了如何使用Javassist获取注解。是除了反射获取注解外的另一种方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值