zoukankan      html  css  js  c++  java
  • JAVA 注解

    1、Annotation的工作原理

      JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型。该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的class文件和一个注解处理工具组成。

      Annotation并不直接影响代码的语义,但是他可以被看做是程序的工具或者类库。它会反过来对正在运行的程序语义有所影响。

      Annotation可以从源文件、class文件或者在运行时通过反射机制多种方式被读取。

    2、元注解

      元注解是指注解的注解。包括  @Retention @Target @Document @Inherited四种。

      A、@Retention: 定义注解的保留策略

        @Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含
        @Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
        @Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

      B、 @Target:定义注解的作用目标

    @Target(ElementType.TYPE)   //接口、类、枚举、注解
    
    @Target(ElementType.FIELD) //字段、枚举的常量
    @Target(ElementType.METHOD) //方法
    @Target(ElementType.PARAMETER) //方法参数
    @Target(ElementType.CONSTRUCTOR)  //构造函数
    @Target(ElementType.LOCAL_VARIABLE)//局部变量
    @Target(ElementType.ANNOTATION_TYPE)//注解
    @Target(ElementType.PACKAGE) ///包   

      由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等

      C、@Document:说明该注解将被包含在javadoc中

      D、@Inherited:说明子类可以继承父类中的该注解

    3、自定义注解使用示例

    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Documented
    @Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER,ElementType.CONSTRUCTOR,ElementType.LOCAL_VARIABLE})
    @Retention(value=RetentionPolicy.RUNTIME)
    @Inherited
    public @interface MyAnnotation {
    
        String[] names() default "abc";
        
        String value();
        
    }
    public class SimpleTest {
    
        @MyAnnotation(names={"a","b"}, value = "aaa")
        public void test() {
            System.out.println();
        }
        
    }

    4、系统内置注解

      注解的语法比较简单,除了@符号的使用外,他基本与Java固有的语法一致,JavaSE中内置三个标准注解,定义在java.lang中:
        @Override:用于修饰此方法覆盖了父类的方法;
        @Deprecated:用于修饰已经过时的方法;
        @SuppressWarnnings:用于通知java编译器禁止特定的编译警告。

    5、利用反射查看注解

    boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
    如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。此方法主要是为了便于访问标记注释而设计的。
    
    参数:annotationClass - 对应于注释类型的 Class 对象
    
    返回:如果指定注释类型的注释存在于此对象上,则返回 true,否则返回 false
    
    抛出:NullPointerException - 如果给定的注释类为 null
    
    从以下版本开始:1.5
    
    T getAnnotation(Class<T> annotationClass)
    如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
    
    参数:annotationClass - 对应于注释类型的 Class 对象
    
    返回:如果该元素的指定注释类型的注释存在于此对象上,则返回这些注释,否则返回 null
    
    抛出:NullPointerException - 如果给定的注释类为 null
    
    从以下版本开始:1.5
    
    Annotation[] getAnnotations()
    返回此元素上存在的所有注释。(如果此元素没有注释,则返回长度为零的数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。
    
    返回:此元素上存在的所有注释
    
    从以下版本开始:1.5
    
    Annotation[] getDeclaredAnnotations()
    返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。
    
    返回:直接存在于此元素上的所有注释
    
    从以下版本开始:1.5
     
     
  • 相关阅读:
    单细胞转录组CNV分析
    瘦子增肌计划 | 健身
    WashU Epigenome Browser | ChIP-seq | DNase-Seq | ATAC-seq | 表观
    羽毛球新手教学
    可变剪切 | isoform | 提取特定exon的usage | DEXSeq
    文献快读 | 单细胞测序肾癌的免疫微环境与临床疗效的关系
    內外全科醫學士課程 | MBBS | 医疗
    天龙八部 | 中国名著 | 刷剧
    当代人工智能的基石 | 数据标注
    提取基因的特定外显子exon的碱基序列 | NCBI
  • 原文地址:https://www.cnblogs.com/tq03/p/3597894.html
Copyright © 2011-2022 走看看