美文网首页
注解 - 标记注解、单成员注解、内置注解

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

作者: 平头哥2015 | 来源:发表于2018-12-04 19:11 被阅读0次

    标记注解

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

    相关文章

      网友评论

          本文标题:注解 - 标记注解、单成员注解、内置注解

          本文链接:https://www.haomeiwen.com/subject/klmvcqtx.html