@(Java)[Annotation|Java]
Java Annotation概述
用途
- 编译器的相关信息,如用于检测错误和一些警告
- 编译时和部署时的处理,如一些软件用于自动生成代码之类的
- 运行时处理
自定义注解
和接口的定义类似,只是用@interface
来标识,注解中包含的属性可以具有默认值,如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ActivityMetadata {
String activityName() default "活动";
}
预定义注解
用于Java语言中的注解
@Deprecated
:用于表示一些类,方法或者属性不再使用@Override
:用于指示编译器,表示元素覆盖了定义在父类的元素@SuppressWarnings
:用于指示编译器不再产生警告@SafeVarargs
:用于方法或者构造器,表示没有对其参数有不安全的操作,编译器不再产生未检查警告@FunctionalInterface
:Java 8中引入,定义类型为函数接口
用于其它注解的注解(元注解)
@Retention
表示注解如何存储,也可以视作注解的生命周期
值 | 说明 |
---|---|
RetentionPolicy.SOURCE | 仅仅保留在源代码中,编译器忽略该注解 |
RetentionPolicy.CLASS | 可以用在在编译器在编译期间,但是JVM忽略该注解 |
RetentionPolicy.RUNTIME | 保留到JVM中,可以在运行期中使用 |
注:大部分框架自定义的注解一般用于RUNTIME,在运行期应用。
@Documented
表示在使用javadoc生成文档的时候,也需要将该注解包含进去
@Target
用于限制其它注解所能使用的范围
值 | 范围 |
---|---|
ElementType.ANNOTATION_TYPE | 注解 |
ElementType.CONSTRUCTOR | 构造器 |
ElementType.FIELD | 属性 |
ElementType.LOCAL_VARIABLE | 局部变量 |
ElementType.METHOD | 方法 |
ElementType.PACKAGE | 包定义 |
ElementType.PARAMETER | 方法参数 |
ElementType.TYPE | 任意类型 |
@Inherited
表示注解可以被继承,默认不继承
@Repeatable
Java 8 中引入,指示注解可以被重复应用于同一个元素
示例:
功能说明:定义一个注解,该注解用于反应属性的中文说明,程序使用反射从中解析出该类的属性以及对应的中文说明。
Activity.java
public class Activity {
@ActivityMeta(description="活动名称")
private String activityName;
@ActivityMeta(description="活动类型")
private String activityType;
public String getActivityName() {
return activityName;
}
public void setActivityName(String activityName) {
this.activityName = activityName;
}
public String getActivityType() {
return activityType;
}
public void setActivityType(String activityType) {
this.activityType = activityType;
}
}
ActivityMeta.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ActivityMeta {
public String description();
}
Demo
public class AnnotationDemo {
private static final Logger logger = LoggerFactory
.getLogger(AnnotationDemo.class);
@Test
public void demo() {
for (Field field : Activity.class.getDeclaredFields()) {
ActivityMeta activityMeta = field.getAnnotation(ActivityMeta.class);
logger.debug(field.getName()+":" + activityMeta.description());
}
}
}
输出:
2016-07-16 12:12:41 [DEBUG]-[Thread: main]-[com.jabnih.analysis.annotation.AnnotationDemo.demo()]:
activityName:活动名称
2016-07-16 12:12:41 [DEBUG]-[Thread: main]-[com.jabnih.analysis.annotation.AnnotationDemo.demo()]:
activityType:活动类型
参考:
官方Tutorial:
https://docs.oracle.com/javase/tutorial/java/annotations/index.html