• 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 {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注解 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{
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    预置的注解

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

    使用反射提取注解

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

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

    获取所有注解

    public Annotation[] getAnnotations() {}
    
    • 1

    获取注解上所有属性值

    @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());
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

  • 相关阅读:
    正则表达式——3.更多种搜寻比对模式
    基于 Kettle + StarRocks + FineReport 的大数据处理分析方案
    操作系统实验四:进程调度
    如何在多线程异步的情况下保证事务?
    Tree Shaking:优化前端项目的利器
    Vue3速成
    如何流畅进入Github
    RK3399驱动开发 | 19 - 阿美林7寸mipi屏幕调试(基于linux4.4.194内核)
    Redis概述及安装使用
    计算机毕业设计ssm+vue+elementUI服装定制系统
  • 原文地址:https://blog.csdn.net/lc257/article/details/125531130