spring-注解和反射基础应用

注解和反射是spring框架的基础机制。
注解可以运用在的方法或类上面的。其功能实现底层是反射。
那注解是怎么通过反射实现想要的功能的呢?
步骤说明如下

  • 1 写一个注解@a
  • 2 写一个实现方法b,实现以下
    - 2.1 获取引用注解的对象的信息
    - 2.2 获取注解
    - 2.3 操作引用注解的对象信息和注解信息,实现自定义注解的具体功能逻辑
  • 3 写业务代码,引用@a注解

代码示例:
1 写一个注解@a

@Target({ElementType.METHOD,ElementType.FIELD,ElementType.TYPE,ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
    int max() default 1;
    int min() default 100;

}

2 写一个实现方法b,实现以下

public class checkTool {
    // 这里的入参是引用注解的对象所属类对象
    public static void checkNum(Object objec){
        try {
            // 获取对象
            Class c=objec.getClass();
            // 获取对象的所有成员变量
            Field[] fields = c.getDeclaredFields();
            for (Field field : fields) {
                // 设置私有属性为可访问,否则,私有属性是不能被访问的
                field.setAccessible(true);
                // 判断当前属性上是否包含自定义的注解
                if (field.isAnnotationPresent(MyAnnotation.class)) {
                    // 获得该属性上的注解信息
                    MyAnnotation myAnnotation=field.getAnnotation(MyAnnotation.class);
                    int max = myAnnotation.max();
                    int min = myAnnotation.min();
                    // 通过反射获取到引用注解的对象的值
                    int num = field.getInt(objec);
                    if(num>max){
                        throw new RuntimeException("超出范围了,装修不了~~");
                    }
                    if(num<min){
                        throw new RuntimeException("没得装修啊~~");
                    }
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }
}

3 写业务代码,引用@a注解

class Home{
    // 引用注解
    @MyAnnotation(min=1,max=100)
    private int area;
    private String addr;
    public Home(int area){
        this.area=area;
    }
}

写个入口运行如下

public class Main {
    public static void main(String[]args) throws NoSuchFieldException, InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        Home home = new Home(-1);
        // 对注解的实现校验。实际开发中不需要自己调用,过滤器/AOP会自动调用
        checkTool.checkNum(home);
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值