注解 - 标记注解、单成员注解、内置注解

2018-12-04  本文已影响0人  平头哥2015

标记注解

标记注解不包含成员,它存在的唯一目的就是标记声明。可以使用由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用于指定能抑制一个或多个编译器可能会报告的警告,以字符串形式表示的名称来指定要被抑制的警告。

上一篇下一篇

猜你喜欢

热点阅读