注解:Annotation(不是程序本身,对程序做出一点解释) 定义方法为:@注释名
你可以把注解理解成一个标识,看到这个注解程序员该做什么事情,程序该如何执行。
比如 Override这种注解,就是告诉程序员这是重写的方法。
类似于spring框架里面的注解,比如controller和autowired,程序在扫描类的时候,如果检测有这些注解,遇到controller会创建这个类的对象,存入容器中,遇到autowired会给属性注入参数,不需要程序员在写代码的时候手动创建对象和赋值,算是一种自动化,可以节省很多代码。(简化程序员的操作)
注解的类型
内置注解
- @Override 方法重写(一般接口实现类中)
- @Deprecated (不推荐使用注解)
- @SuppressWarnings (抑制警告)
元注解:元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。明白点说,就是我们定义注解时用的注解就是元注解。
- @Target:注解的作用目标
- @Retention:注解的生命周期
- @Documented:注解是否应当被包含在 JavaDoc 文档中
- @Inherited:是否允许子类继承该注解
自定义注解 (除了@符号,注解很像是一个接口。定义注解的时候需要用到元注解。)
- @Retention
Retention意为保留期,@Retention用来解释说明一个注解的存活周期
@Retention取值:- RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
- RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
- RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
示例:
@Retention(RetentionPolicy.CLASS)
public @interface TestAnnotation {
}
-
@Documented
用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。 -
@Target
指定注解应用的地方,用来限定注解的应用场景(类,方法,参数等等)
(不使用@Target注解则默认不限制)
取值如下:- ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
- ElementType.CONSTRUCTOR 可以给构造方法进行注解
- ElementType.FIELD 可以给属性进行注解
- ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
- ElementType.METHOD 可以给方法进行注解
- ElementType.PACKAGE 可以给一个包进行注解
- ElementType.PARAMETER 可以给一个方法内的参数进行注解
- ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
-
@Inherited
继承的意思,当一个超类被@Inherited(@Inherited注解)注解的注解(A注解)进行过注解的话,如果它的子类没有被如何其他注解进行注解,那么这个子类就继承了超类的注解(A注解)
@interface (自定义注解)
Java.lang.reflect.AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通过反射获取了某个类的AnnotatedElement对象之后,程序就可以调用该对象的如下四个个方法来访问Annotation信息:
方法1:<T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。
方法2:Annotation[] getAnnotations():返回该程序元素上存在的所有注解。
方法3:boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.
方法4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响.
Class对象也实现了该接口,即可以获取目标对象的注解,继而可以根据注解的属性,获得对象的成员变量、方法等。
https://my.oschina.net/kbdxe/blog/2120740 (参考地址,本文仅限本人学学习使用)
浙公网安备 33010602011771号