本文介绍了如何自定义Java注解。
《夜雨寄北》
君问归期未有期
巴山夜雨涨秋池
何当共剪西窗烛
却话巴山夜雨时
-唐,李商隐
用过很多注解,却一个都不会写。
Java注解,很基础的知识了,也很简单,先来看一个示例:
1 | import java.lang.annotation.Documented; |
定义注解的类型的为@interface,和定义接口很像,其中@Documented注解表示将此注解包含在Javadoc中。@Retention表示注解保留策略,可选的值有:
- RetentionPolicy.SOURCE:注解会被编译器移除
- RetentionPolicy.CLASS:注解会被编译器记录在类文件中但在运行时会被VM移除,这也是默认的策略
- RetentionPolicy.RUNTIME:注解会被编译器记录在类文件中并且在运行时会被VM保留,因此我们可以通过反射读取。
@Target的值为一个ElementType枚举类型,可选的值有:
- ElementType.TYPE:表示注解可以用在类,接口(包括注解类型),或枚举声明上。
- ElementType.FIELD:域声明上(包括枚举常量上)。
- ElementType.METHOD:方法声明上。
- ElementType.PARAMETER:参数声明上。
- ElementType.CONSTRUCTOR:构造函数声明上。
- ElementType.LOCAL_VARIABLE:本地变量上。
- ElementType.ANNOTATION_TYPE:注解类型声明上。
- ElementType.PACKAGE:包声明上。
@Inherited注解表示该注解可以从父类继承,默认为false。只能应用于类声明。
@Repeatable注解,Java 8中引入,表示被标记的注解可以应用多次。更多信息请查看Repeating Annotations。
我们可以使用default关键字指定默认值,这样我们在使用注解的时候可以不指定参数值,如果不使用default关键字,则需要指定参数值:1
2
3
4
5
6
7
8@MyAnnotation
public void test() {
}
// or
@MyAnnotation(priority = 3,value = "myvalue")
public void test() {
}
关于自定义Java注解就先介绍到这里,后续会继续学习Java注解处理器的使用,敬请关注。
参考
- http://blog.csdn.net/lifetragedy/article/details/7394910
- https://docs.oracle.com/javase/tutorial/java/annotations/index.html