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
 
 
原文地址:https://www.cnblogs.com/tq03/p/3597894.html