首先来段例子:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface DefaultStringValue {
/** 默认字符串内容 */
String value();
}
使用:
public interface R {
public static final R R = Resources.create(R.class);
@DefaultStringValue(value = "所属组织不存在")
String nullOrg();
@DefaultStringValue(value = "指定的{0}\"{1}\"不存在。")
String nullObject();
@DefaultStringValue(value = "第{0}行商品{1}不存在。")
String productNotFound();
}
那么我们在R.R.nullOrg(),就可以获得value的值。
@Target 声明注解修饰的范围。包,类,方法,参数,本地参数等目标
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@RetentionPolicy 设置注解保留的时间长短。有的只在源码中,而被编译器抛弃。有的被编译在class中,可能会被虚拟机忽略。还有一种可以在class装载时被读取。上面这个例子就是第三种了。因为需要运行时去读取。
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
@Documented 其他类型的注解被作为被标注的程序成员的公共API,就是说注解包含在javadoc中。
@Inherited 这是一个标记注解
@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。