java注解简单介绍

元注解

Retention

取值如下

  1. RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
  2. RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
  3. RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
Documented

它的作用是能够将注解中的元素包含到 Javadoc 中去。

Target

当一个注解被 @Target 注解时,这个注解就被限定了运用的场景。

  1. ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
  2. ElementType.CONSTRUCTOR 可以给构造方法进行注解
  3. ElementType.FIELD 可以给属性进行注解
  4. ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
  5. ElementType.METHOD 可以给方法进行注解
  6. ElementType.PACKAGE 可以给一个包进行注解
  7. ElementType.PARAMETER 可以给一个方法内的参数进行注解
  8. ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
Inherited

如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}
---------------------------------------------------------------------------
@Test
public class A {}
public class B extends A {}

注解 Test 被 @Inherited 修饰,类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解

Repeatable

使用方法

@interface Persons {
    Person[]  value();
}
---------------------------------------------------------------------------
@Repeatable(Persons.class)
@interface Person{
    String role default "";
}
---------------------------------------------------------------------------
@Person(role="artist")
@Person(role="coder")
@Person(role="PM")
public class SuperMan{
}

预置的注解

@Deprecated:告诉开发者正在调用一个过时的元素比如过时的方法、过时的类、过时的成员变量
@Override
@SuppressWarnings:调用被 @Deprecated 注解的方法后,编译器会警告提醒,而有时候开发者会忽略这种警告,他们可以在调用的地方通过 @SuppressWarnings 达到目的。
@SafeVarargs:提醒开发者不要用参数做一些不安全的操作,仅提醒,不会对程序有影响
@FunctionalInterface:函数式接口

使用反射提取注解

使用class对象判断是否包含某个注解

public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}

获取所有注解

public Annotation[] getAnnotations() {}

获取注解上所有属性值

@TestAnnotation()
public class Test {
    public static void main(String[] args) {
        boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);
        if ( hasAnnotation ) {
            TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class);
            System.out.println("id:"+testAnnotation.id());
            System.out.println("msg:"+testAnnotation.msg());
        }
    }
}

同样的Field和Method类里也有对应操作注解的方法。
如果一个注解要在运行时被成功提取,那么 @Retention(RetentionPolicy.RUNTIME) 是必须的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值