从JDK5开始,Java增加对元数据的支持,也就是注解。可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息,例如SSM项目中标记一个类为Controller的bean。
元注解
元注解也就是能够定义在注解上的注解。这里只涉及到常用的元注解
@Retention
当@Retention应用到一个注解上时,解释说明了这个注解的存活时间。
取值如下:
-
RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
-
RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。注解默认使用这种方式。
-
RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。因此可以使用反射机制读取该注解的信息。
@Target
当@Retention应用到一个注解上时,解释说明了这个注解的作用范围。
取值如下:
-
ElementType.ANNOTATION_TYPE 可以给一个注解进行注解(元注解)
-
ElementType.CONSTRUCTOR 可以给构造方法进行注解
-
ElementType.FIELD 可以给属性进行注解
-
ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
-
ElementType.METHOD 可以给方法进行注解
-
ElementType.PACKAGE 可以给一个包进行注解
-
ElementType.PARAMETER 可以给一个方法内的参数进行注解
-
ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
自定义注解
Java通过@interface来声明一个注解,String value() default " " 代表该注解的成员变量默认取值为空字符
public @interface TestAnnotation {
String value() default "";
}
自定义注解中,注解的成员变量在注解的定义中以"无形参的方法"形式进行声明。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
String value() default "";
int id() default 0;
}
调用时,如果不指定注解的成员变量,则会默认进行赋值
@TestAnnotation(value="xxx",id="1998")
public TestClass{
}
注解的成员变量可支持的数据类型为:
- 所有基本数据类型
- String
- Class
- enum
- Annotation
- 以上所有类型的数组
且其成员变量只能采用public或default(默认)进行修饰