一、基本概念
1、注解粗略的理解可以看成是标签。
2、Java注解是附加在代码中的一些元信息,用于编译和运行时进行解析和使用,起到说明、配置的功能。
二、定义与使用
1、注解通过 @interface 关键字进行定义。
public @interface TestAnnotation {
}
2、应用时直接在类、接口、方法的上方
@TestAnnotation
public class Test {
}
三、注解的属性
1、注解可以有>=0个成员变量
2、成员变量均为无参
3、调用成员变量直接,在注解括号内以value = “ “形式赋值,若只有一个成员变量则可直接在括号内赋值
@TestAnnotation(id=3,msg="hello annotation")
4、 成员变量类型只能为八种基本数据类型外加类、接口、注解和数组。
5、 可用default指定默认值
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
int id() default -1;
String msg();
}
四、元注解
自定义注解时,可以使用元注解进行限制。
元标签有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 种。
1、 @Retention-保留期,取值如下:
1) RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
2) RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
3) RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
2、@Documented -将注解中的元素包含到 Javadoc 中去。
3、@Target -限定注解运用的场景(类、接口、方法、参数等),取值如下:
• ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
• ElementType.CONSTRUCTOR 可以给构造方法进行注解
• ElementType.FIELD 可以给属性进行注解
• ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
• ElementType.METHOD 可以给方法进行注解
• ElementType.PACKAGE 可以给一个包进行注解
• ElementType.PARAMETER 可以给一个方法内的参数进行注解
• ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
4、@Inherited 子类就继承了超类的注解。
5、@Repeatable -重复,注解的注解可以多次使用
五、注解的运行原理
1、 注解通过反射获取。通过 Class 对象的isAnnotationPresent() 方法判断它是否应用了某个注解。
2、 然后通过 getAnnotation() 方法来获取 Annotation 对象,进而调用其中的属性。
六、Java内置的注解
1、@Deprecated
提示开发者正在调用一个过时的元素比如过时的方法、过时的类、过时的成员变量。
2、@Override
复写父类中被 @Override 修饰的方法
3、@SuppressWarnings
阻止警告的意思。调动@SuppressWarnings达到阻止或警告某个信息.
@SuppressWarnings("deprecation")
public void test1(){
Hero hero = new Hero();
hero.say();
hero.speak();
}
4、@SafeVarargs
参数安全类型注解。它的目的是提醒开发者不要用参数做一些不安全的操作,它的存在会阻止编译器产生 unchecked 这样的警告。
6、@FunctionalInterface
函数式接口注解