定义语法
注解语法结构:
[public] @interface 注解名 {
[属性1;]
[属性2;]
...
[属性n;]
}
属性语法结构:
数据类型 属性名() [default 默认属性值];
示例
public @interface TestAnnotation {
String value();
}
修饰自定义注解的元注解
@Target
用于指定被修饰的自定义注解只能用于修饰程序中哪些元素,该元注解有如下常用属性值:
- ElementType.METHOD:应用于方法
定义如下注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
public @interface TestAnnotation {
}
test类:
显然在类之前和在属性之前的注解报错。
- ElementType.TYPE:应用于类、接口或者枚举声明
定义如下注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface TestAnnotation {
}
test类:
显然在类之前的注解不在报错,而属性之前的注解依然报错。
- ElementType.FIELD:应用于全局属性
定义如下注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.FIELD,ElementType.TYPE,ElementType.METHOD})
public @interface TestAnnotation {
}
test类:
不再报错。
@Retention
用于指定被修饰的自定义注解可以保留多久,该元注解有如下属性值:
- RetentionPolicy.SOURCE:编译器将直接丢弃被修饰的注解。
我们可以通过使用Test类的Class对象来获取对Test类的注解。
import java.lang.annotation.Annotation;
@TestAnnotation
public class Test {
public static void main(String[] args) {
Class clazz = Test.class;
Annotation[] annotations = clazz.getAnnotations();
if(annotations.length==0) {
System.out.println("注解未获取");
}
for (Annotation annotation : annotations) {
System.out.println(annotation.toString());
}
}
}
执行结果:
- RetentionPolicy.CLASS:默认值,编译器将把注解记录在class文件中,当运行Java程序时,虚拟机不再保留注解;
设置自定义注解@Retention(RetentionPolicy.CLASS)
执行结果显然和之前一样:
- RetentionPolicy.RUNTIME:编译器将把注解记录在class文件中,当运行java程序时,虚拟机保留注解,程序可以通过反射获取该注解;
设置自定义注解@Retention(RetentionPolicy.RUNTIME)
执行结果:
@Documented
执行javadoc命令时,被该元注解修饰的自定义注解也会生成在文档中
//自定义注解
import java.lang.annotation.Documented;
@Documented
public @interface TestAnnotation {
}
//Test类
@TestAnnotation
public class Test {
}
操作过程:
首先点解Export导出,搜索javadoc,点击next
选择注解java项目点击next
直到出现下图界面,在箭头框内输入-encoding UTF-8 -charset UTF-8,此步骤可以导出有中文注释的java项目,若没有中文注释直接finish就行。
查看文档: