注解

2020-04-26  本文已影响0人  面向星辰大海的程序员

注解的定义
Java注解用于为Java代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上是用于这一目的的。Java注解是从Java5开始添加到Java的。

注解即标签
注解就是为 类,接口,方法,属性等打上一个标签

如何自定义注解
1.通过@interface关键字定义

public @interface Test {
}

元注解:注解的注解,就是标签的标签
有5种:@Retention、@Document、@Target、@Inherited、@Repeatable
@Repeatable
java8新添加的,可重复的意思,被此注解注释的注解可以重复使用在一个对象

@Retention
Retention的英文意思是保留期的意思。当@Retention应用到一个注解上的时候,它解释说明了这个注解的存活时间。
取值如下:
1.RetentionPolicy.SOURCR:注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视
2.RetentionPolicy.CLASS:注解只被保留到编译进行的时候,它并不会被加载到JVM中。
3.RetentionPolicy.RUNTIME:注解可以保留到程序运行的时候,他会保留到JVM中,所以在运行程序时可以获取到它们。

@Target
Target是目标的意思、@Target指定了注解运用的地方
当一个注解被@Target注解时,这个注解就被限定了运用场景。
举例:原本标签可以任意贴在认任何地方,但是被@Target注释的标签只能贴在指定范围内,比如类、方法、属性等。
取值如下:
/** 类、接口(包括注释类型)或enum声明 /
TYPE,
/
字段声明(包括enum常量) /
FIELD,
/
方法声明 /
METHOD,
/
* 正式的参数声明,方法的参数进行注解/
PARAMETER,
/
* 构造函数声明 /
CONSTRUCTOR,
/
局部变量声明 /
LOCAL_VARIABLE,
/
注释类型声明 /
ANNOTATION_TYPE,
/
* 包声明/
PACKAGE,
/
*
* 类型参数声明
* @since 1.8
/
TYPE_PARAMETER,
/
*
*使用类型
* @since 1.8
*/
TYPE_USE

@Document
顾名思义,这个元注解肯定和文档有关,他的作用是能将注解的元素包含到Javadoc中去。ElementType.TYPE可以给一个类型进行注解,比如类、接口、枚举
@Inherited
Inherited是继承的意思,但是并不是说注解本身可以继承,而是说如果一个超类被@Inherited注解过的注解进行注解的话,那么如果它的子类没有被任何注解注释的话,那么这个子类就继承了超类的注解。

注解的属性
注解的属性也叫做成员变量。注解只有成员变量,没有方法。
在注解中定义属性时它的类型必须是8种基本数据类型外加类(Class)、接口、注解以及他们的数组,注解种的属性可任意有默认值,默认值需要用default 关键字指定

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test{
int id() default -1;
String msg() default "Hello";
}

注解的提取
运行期注解通过反射获取。首先可以通过 Class 对象的 isAnnotationPresent() 方法判断它是否应用了某个注解

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

然后通过 getAnnotation() 方法来获取 Annotation 对象。

 public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}

或者是 getAnnotations() 方法。

public Annotation[] getAnnotations() {}

前一种方法返回指定类型的注解,后一种方法返回注解到这个元素上的所有注解。
如果获取到的 Annotation 如果不为 null,则就可以调用它们的属性方法了。比如

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

APT

注解的用处:
1.提供信息给编译器:编译器可以利用注解来探测错误和警告信息。(AS)
2.编译阶段时的处理:软件工具可以利用注解信息来生成代码、Html、文档或者做其他相应处理。(aapt2)
3.运行时的处理:某些注解可以在程序运行的时候接受代码的提取。(通过反射,应该有个工具在运行期间获取注解信息)

3个知识点:Java注解、java反射、依赖注入

依赖注入标准

@Inject

注解 @Inject
标识了可注入的构造器、方法或字段。可以用于静态或实例成员。一个可注入的成员可以被任何访问修饰符(private、package-private、protected、public)修饰。注入顺序为构造器,字段,最后是方法。超类的字段、方法将优先于子类的字段、方法被注入。对于
同一个类的字段是不区分注入顺序的,同一个类的方法亦同

Provider<T>

接口 Provider 用于提供类型 T 的实列。Provider 是一般情况是由注入器实现的。对于任何可注入的 T 而言,您也可以注入 Provider<T>。与直接注入 T 相比,注入 Provider<T> 使得:

    class Car {
       @Inject Car(Provider<Seat> seatProvider) {
            Seat driver = seatProvider.get();
            Seat passenger = seatProvider.get();
           …
    }
}

@Qualifier

用于标识限定器注解。任何人都可以定义新的限定器注解。一个限定器注解:

@Named

@Scope

@Singleton

上一篇下一篇

猜你喜欢

热点阅读