JDK5及其以后的JDK版本开始支持Java注解;Java注解也叫做元数据。
Java除本身自带的注解外该可以自定义自己需要的注解,并且Java提供了四个用于修饰自定义注解的元注解:@Target、@Retention @Documented 和 @Inherited
@Target
该元注解的作用是控制自定义注解的作用位置,即用于指定被修饰的自定义注解只能用于修饰程序中哪些元素,该元素有以下几种属性值:
- ElementType.ANNOTATION_TYPE:应用于其他注解的元注解
- ElementType.CONSTRUCTOR:应用于构造函数
- ElementType.FIELD:应用于全局属性
- ElementType.LOCAL_VARIABLE:应用于方法中的本地变量
- ElementType.METHOD:应用于方法
- ElementType.PACKAGE:应用于包
- ElementType.PARAMETER:应用于方法的参数
- ElementType.TYPE:应用于类、接口或者枚举声明
注意:3、5、7、8字体加深的部分是比较常用且重要的属性值;我们以8中 ElementType.TYPE 为例:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
public @interface Service {
String value() default "";
int version() default 1;
}
自定义一个注解叫 Service(不是Spring中Service注解,这里没引jar包,仅是自定义注解),然后设置属性 ElementType.TYPE ;我们就可以用来注解类了;
@Service(value="",version=1)
public class Test {
}
@Retention
用来控制注解保存到什么时候,就是控制注解存在于Java源码在编译和翻译的哪些过程;有以下几种属性:
- RetentionPolicy.SOURCE:编译器将直接丢弃被修饰的注解。
- RetentionPolicy.CLASS:默认值,编译器将把注解记录在class文件中,当运行Java程序时,虚拟机不再保留注解;
- RetentionPolicy.RUNTIME:编译器将把注解记录在class文件中,当运行java程序时,虚拟机保留注解,程序可以通过反射获取该注解;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Service {
String value() default "";
int version() default 1;
}
对Service自定义注解稍作修改。添加 @Retention 注解并设置 RetentionPolicy.RUNTIME 属性;
@Service(value="",version=1)
public class Test {
public static void main(String[] args) {
Class clazz = Test.class;
Object object = clazz.getAnnotation(Service.class);
System.out.println(object);
}
}
//输出语句
@zhujie.Service(value=, version=1)
然后我们获取Test类的Service注释并输出会得到如上结果,如果我们设置的属性是 RetentionPolicy.SOURCE 或 RetentionPolicy.CLASS,我们什么都得不到,输出结果为null,因为这些属性的设置,注解是保存不到运行时的。
@Documented 和 @Inherited
@Documented 执行javadoc命令时,被该元注解修饰的自定义注解也会生成在文档中;
@Inherited :如果父类所使用的注解有@Inherited修饰,则子类可以继承该注解,否则不能继承。
这两个注解相对来说不太重要,也是比较简单的,不再举例,可自行探索。