Java学习(八)
Annotation概念
用于修饰包、类、构造器、方法、成员变量、参数、局部变量的生命,用于设置元数据,这些信息存储在Annotation的name=value
对中
基本的Annotation
-
@Override
,用于指定方法重写,写在子类覆盖父类的方法之前,告知编译器必须检查子类是否重写父类方法 -
@Deprecated
表示内容已经过时,如果再使用,编译器会发出警告 -
@SuppressWarnings
关闭编译器警告,并且会渗透性地作用于该程序元素的所有子元素,使用方法@SuppressWarnings(value="unchecked")
-
@SafeVarargs
,屏蔽Java堆污染警告。堆污染:泛型对象和非泛型对象间的相互赋值就会引发堆污染。 -
@FunctionalInterface
,显式声明函数式接口,避免低级错误
JDK的元Annotation
-
@Retention
,用于指定Annotation能保留多长时间:RetentionPolicy.CLASS
:运行时不可获取Annotation信息RetentionPolicy.RUNTIME
:运行时可通过反射获取Annotation信息RetentionPolicy.SOURCE
:只保留在源代码里,编译器直接丢弃这种Annotation -
@Target
,指定Annotation只能用于修饰哪种程序单元例如:
@Target(ElementType.FIELD)
只能修饰成员变量@Target(ElementType.METHOD)
只能修饰方法 -
@Documented
,跟API文档有关 -
@Inherited
,指定其修饰的Annotation具有继承性(如果某个类用了某个@Xxx
,那么他的子类也将获得@Xxx
修饰)
自定义Annotation
使用@interface
关键字,例如:
public @interface Test
{
String name();/*自定义的Annotation变量的形式为方法的形式*/
int age() default 32; /*也可以这样指定默认值*/
}/*定义一个Annotation*/
@Test(name = "xx", age = 6)/*如果在自定义的Annotation内定义了成员变量,那么在使用时就必须赋值*/
public class MyClass
{
......
}
没有成员变量的Annotation又称为标记Annotation,有成员变量的Annotation称为元数据Annotation
提取Annotation
AnnotatedElement
接口是所有程序元素的父接口,用于访问程序元素的Annotation信息,但获取程序元素需要使用反射