标记注解
标记注解不包含成员,它存在的唯一目的就是标记声明。可以使用由AnnotatedElement接口定义的isAnnotationPresent()方法确定标记注解是否存在。
例子
@Retention(RetentionPolicy.RUNTIME)
public @interface MarkerAnno {
}
public class MarkerTest {
@MarkerAnno
public static void test() {
MarkerTest mt = new MarkerTest();
try {
Method m = mt.getClass().getMethod("test");
if (m.isAnnotationPresent(MarkerAnno.class)) {
System.out.println("MarkerAnno is present.");
}
} catch (NoSuchMethodException e) {
System.out.println("Method Not Found.");
}
}
}
注意:应用标记注解的时候注解后面不需要有圆括号。
单成员注解
单成员注解只包含一个成员,且如果成员的名称是value,就可以使用缩写形式,即在指定成员值的时候不需要指定成员名称。
例子
@Retention(RetentionPolicy.RUNTIME)
public @interface SingleAnno {
int value();
}
public class SingleTest {
@SingleAnno(100)
public static void test() {
// ...
}
}
注意:当注解含有多个成员的时候,也可以使用单成员语法,但是其它成员必须有默认值,且没有为其它成员指定值。
内置注解
Java提供了许多内置注解,大部分是专用注解,但是有9个用于一般目的。这9个注解中,有4个来自java.lang.annotation包,分别是@Retention、@Documented、@Target和@Inherited;另外5个来自java.lang包,分别是@Override、@Deprecated、@FunctionalInterface、@SafeVarargs和@SuppressWarnings。
@Retention
@Retention只能用于注解其它注解,指定注解的保留策略。
@Documented
@Documented是标记注解,只能用于注解其它注解,通知某个工具注解将被文档化。
@Target
@Target只能用于注解其它注解,指定可以应用注解的声明的类型。@Target只有一个用于指定声明类型的参数,这个参数必须是来自ElementType枚举的常量。
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD,
/** Method declaration */
METHOD,
/** Formal parameter declaration */
PARAMETER,
/** Constructor declaration */
CONSTRUCTOR,
/** Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/** Package declaration */
PACKAGE,
/**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
}
@Target可以指定这些值的一个或多个,例如:
@Target({ElementType.FIELD, ElementType.LOCAL_VARIABLE})
@Inherited
@Inherited是标记注解,只能影响用于类声明的注解。@Inherited会使得父类的注解被子类继承。当获取子类的特定注解时,如果那种注解在子类中不存在,就会检查父类。如果那种注解存在于父类中,并且使用@Inherited进行了注解,就会返回那种注解。
@Override
@Override是标记注解,只能用于方法。带有@Override注解的方法必须重写父类中的方法。如果不这样做就会产生编译错误,从而确保父类的方法被真正的重写,而不是简单地重载。
@Deprecated
@Deprecated是标记注解,用于指示声明是过时的,并且已经被更新的形式取代。
@FunctionalInterface
@FunctionalInterface是JDK 8新加的一个标记注解,用于接口,指出被注解的接口是一个函数式接口。函数式接口是指仅包含一个抽象方法的接口,由lambda表达式使用。
@SafeVarargs
@SafeVarargs是标记注解,只能用于varargs方法或者声明为static或final的构造函数,指示没有发生与可变长度参数相关的不安全动作。
@SuppressWarnings
@SuppressWarnings用于指定能抑制一个或多个编译器可能会报告的警告,以字符串形式表示的名称来指定要被抑制的警告。
网友评论