注解

注解:注解为我们在代码中添加信息,提供了一种形式化的方法,使我们可以在稍后的某个时刻非常方便的使用这些信息(通过代码来获取,并使用这些定义的额外信息)

注解本身,只是用来传达一种代码之外的,额外的信息,但是,通常注解,都会有一些特殊的效果表现来,但这些特殊效果,和注解本身,没有关系
自定义注解格式:

    public @interface 注解名 {
    定义体
}

自定义注解体的说明:
1、注解体的格式类似于接口中的方法定义,但含义完全不同
2、方法名就是数据的名称,方法的返回值类型表示数据值的类型
3、在定义中,一条信息合法的取值有:
1、基本数据类型
2、String
3、Class类型
4、以上类型的数组

注解的使用: 在定义好注解类型之后,利用注解实例给代码添加额外信息
@注解类型名(属性名1 = 属性值1,属性名2 = 属性值2,…)
注意事项:
在使用注解实例的时候,一定要保证注解定义中的每条数据(每一个属性),必须有确定值。
两种方式赋值:
1、在使用注解实例的时候,给每一个属性赋值

        @AgeConstraint(lowerBound = 10, upperBound = 25)
        private int age;

	2、可以在定义注解的时候,给注解定义的某个属性声明默认值。默认值的含义是指,当在使用注解实例的时候,如果没有给某属性显示赋值,此时如果该属性定义了默认值,那么在注解实例中,该属性的值会自动取默认值。对于引用数据类型的数据,默认值不能是null

        @interface AgeConstraint {
          // 定义年龄取值的下界
          int lowerBound() default 10;
        }

在有一种特殊情况下,对于注解实例中的属性赋值可以简化,需满足的条件是:
a、属性名称固定为value;
b、当在注解实例中仅仅只需要给value属性赋值的时候(即没有其他属性,或其他属性已经默认赋值)

注解处理器:通过一些其他方式获得所需注解信息,然后根据需求实现特殊功能
成员变量的对象 . isAnnotationPresent(目标注解类型.class)
这个api帮我们判断,成员变量上是否有目标注解,有返回true,没有就返回false
成员变量对象 . getAnnotation(目标注解类型.class)
从Field对象表示的成员变量上获取注解实例

      private void judgeAge(int age) throws NoSuchFieldException {
        // 获取Sudent中age成员变量的约束
        // 1. 首先获取age成员变量
        Field ageField = clz.getDeclaredField("age");

        //为了规避,权限问题
        ageField.setAccessible(true);

        // 2. 获取该成员变量的注解信息
        if (ageField.isAnnotationPresent(AgeConstraint.class)) {
          //如果该成员变量,有注解,那才获取注解
          AgeConstraint ageAnnotation = ageField.getAnnotation(AgeConstraint.class);

          // 从注解实例中获取,注解中定义的属性值, 非常类似于方法调用
          int lowerBound = ageAnnotation.lowerBound();
          int upperBound = ageAnnotation.upperBound();
          //根据需求,判断
          if (age < lowerBound || age > upperBound) {
            // age初始化参数的值不合法
            throw new IllegalArgumentException("学生的年龄参数非法:" + age);
          }
        }

元注解:描述注解的注解

注解的三种保留级别:SOURCE->注解只会存在Java源代码中,编译时将被丢弃
CLASS->可以出现在Java源代码和字节码文件中,但加载时会被 Jvm丢弃
RUNTIME ->三个阶段注解都可以保留,运行时才可以获取到注解

常用元注解:
1. @Rentention元注解,来定义我们自己定义的注解的保留级别.
2. @Target元注解,注解可以作用的目标
对于注解而言,可以作用的目标:
1. 整个类 ElementType.TYPE
2. 成员变量 ElementType.FIELD
3. 构造方法 ElementType.CONSTRUCTOR
4. 成员方法 ElementType.METHOD

    @Retention(RetentionPolicy.RUNTIME)
    // 给注解中数组类型的,属性赋值{}
    @Target({ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE})
    @interface AgeConstraint {

      // 定义年龄取值的下界
      int lowerBound() default 10;

      //定义年龄取值的上界
      int upperBound() ;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值