美文网首页
Java注解初探

Java注解初探

作者: 王灵 | 来源:发表于2022-10-19 09:23 被阅读0次

    Java注解定义

    注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

    Java注解作用

    1、编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
    2、代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
    3、编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】

    Java注解分类

    1、内置的作用在代码的注解

    • @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
    • @Deprecated - 标记过时方法。如果使用该方法,会报编译错误。
    • @SuppressWarnings - 指示编译器去忽略注释中声明的警告。
      2、内置的作用在其它注解上的注解(原注解)
    • @Retention - 标示这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
    • @Documented - 标记这些注释是否包含在用户文档中。
    • @Target - 表示这个注释的作用范围
    • @Inherited - 标示注释可被继承类获取
      3、从Java7开始,额外添加了3个注释:
    • @SafeVarargs - Java7开始支持,忽略任何使用参数为范型变量的方法或构造函数调用产生的警告。
    • @Functionallnterface - Java8开始支持,标识一个匿名函数或函数式接口。
    • @Repeatable - Java8开始支持,标识某注解可以在同一个声明上使用多次

    Annotation组成部分

    java Annotation的组成中,有3个非常重要的主干类。它们分别是:

    • Annotation.java
    public interface Annotation {
        /**
         * @return true if the specified object represents an annotation
         */
        boolean equals(Object obj);
    
        /**
         * @return the hash code of this annotation
         */
        int hashCode();
    
        /**
         * @return a string representation of this annotation
         */
        String toString();
    
        /**
         * @return the annotation type of this annotation
         */
        Class<? extends Annotation> annotationType();
    }
    
    • ElementType.java
    public enum ElementType {
        /** 类、接口(包括注释类型)或枚举声明*/
        TYPE,
    
        /** 字段声明(包括枚举常量)*/
        FIELD,
    
        /** 方法声明 */
        METHOD,
    
        /** 正式的参数声明 */
        PARAMETER,
    
        /** 构造函数声明 */
        CONSTRUCTOR,
    
        /** 本地变量声明*/
        LOCAL_VARIABLE,
    
        /** 注释类型声明 */
        ANNOTATION_TYPE,
    
        /** 包声明 */
        PACKAGE,
    
        /**
         * 类型参数声明
         * @since 1.8
         */
        TYPE_PARAMETER,
    
        /**
         * 字体的使用
         * @since 1.8
         */
        TYPE_USE
    }
    
    • RetentionPolicy.java
    public enum RetentionPolicy {
        /*注释将被编译器丢弃*/
        SOURCE,
    
        /**
         * 注释由编译器记录在类文件中
         * 但不需要在运行时被VM保留。这是默认设置
         */
        CLASS,
    
        /**
         * 注释由编译器和记录在类文件中
         * 在运行时被VM保留,因此它们可以被反射式读取。
         */
        RUNTIME
    }
    

    自定义注释

    //元注释
    public @interface 注释名称{
        // 属性列表
    }
    

    1、创建一个注释

    @Deprecated //是否为过期方法
    @Documented //标记这些注释是否包含在用户文档中
    @Retention(RetentionPolicy.RUNTIME)//注释怎么保存
    @Target(ElementType.METHOD)//注释用在哪里
    @Inherited //注释是否可以被继承
    public @interface TestAnnotation {
        String value();
    }
    

    2、创建一个使用注释的类

    public class HelloAnnotationClient {
        @TestAnnotation("matthew")
        public void sayHello() {
            System.out.println("Inside sayHello method...");
        }
    }
    

    3、通过反射获取方法及注释携带的信息注意,如果要携带信息能在运行时被反射获取需要设置@Retention(RetentionPolicy.RUNTIME)

    public class HelloAnnotationTest {
        public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
            HelloAnnotationClient helloAnnotationClient = new HelloAnnotationClient();
            Method method = helloAnnotationClient.getClass().getMethod("sayHello");
            if (method.isAnnotationPresent(TestAnnotation.class)) {
                TestAnnotation annotation = method.getAnnotation(TestAnnotation.class);
                System.out.println("Value:"+annotation.value());
                method.invoke(helloAnnotationClient);
            }
        }
    
    }
    

    4、运行的结果

    Value:matthew
    Inside sayHello method...
    
    Process finished with exit code 0
    

    相关文章

      网友评论

          本文标题:Java注解初探

          本文链接:https://www.haomeiwen.com/subject/qfwjzrtx.html