Java注解详解

注解定义

注解自jdk1.5引入,在程序中作为元数据,对程序项如类、方法、属性、参数等做标注接受作用,可以由编译工具解析,或者在执行时通过反射解析,以对程序做运行时的动态调整。

java内置注解

  1. @Override
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {
    }

    这个注解应该都很熟悉,用于指明当前方法是重写了父类中的相应方法,如果某个方法上加了这个注解,而父类中又没有该方法,则编译器会报错。

  2. @Deprecated

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
    public @interface Deprecated {
    }

    这个注解指明当前方法或属性或者类等已经过时,不推荐再继续使用,通常调用该注解修饰的方法会带中划线表示。

  3. @SuppressWarnings

    @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface SuppressWarnings {
        String[] value();
    }

    该注解指定忽略某系编译器警告,其中value为忽略的警告的名称,只能有一个值。

元注解

元注解指修饰注解的注解,java定义了4种特殊的注解,用于定义注解时使用,具体如下

  1. @Retention
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.ANNOTATION_TYPE)
    public @interface Retention {
        RetentionPolicy value();
    }

    此注解指定被修饰的注解的保留策略,值有三种,分别为SOURCE(源码种保留,编译后清除), CLASS(class文件中保留,运行时清除), RUNTIME(运行时保留,可通过反射获取),具体定义在以下枚举文件中

    public enum RetentionPolicy {
        /**
         * Annotations are to be discarded by the compiler.
         */
        SOURCE,
    
        /**
         * Annotations are to be recorded in the class file by the compiler
         * but need not be retained by the VM at run time.  This is the default
         * behavior.
         */
        CLASS,
    
        /**
         * Annotations are to be recorded in the class file by the compiler and
         * retained by the VM at run time, so they may be read reflectively.
         *
         * @see java.lang.reflect.AnnotatedElement
         */
        RUNTIME
    }

     

  2. @Target

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.ANNOTATION_TYPE)
    public @interface Target {
        ElementType[] value();
    }

    此注解指定注解修饰的对象类型,其值定义在如下枚举类中

    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
    }
    

    根据枚举元素的字面意思应该都能理解其代表的类型,该值可以是多个,用逗号分隔开。

  3. @Inherited

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.ANNOTATION_TYPE)
    public @interface Inherited {
    }

    指定子类可以继承父类的注解,默认情况子类的方法、属性等不会继承父类的。被该注解修饰的注解,用于修饰方法时,子类中该方法也带有此注解。该注解没有值。

  4. @Documented

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.ANNOTATION_TYPE)
    public @interface Documented {
    }

    该注解修饰的元素可以被Javadoc等工具文档化。

自定义注解

从上面元注解的定义方式就可以看出自定义注解的方式,关键字为@interface,接着是注解名,{}中是该注解的值,定义方法与接口中定义方法的方式类似:类型 属性名() default 默认值。

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.Method)
public @interface Test{
    String value() default "test";
}

其中,@Rentention和@Target元注解必须有,@Documented和@Inherited可选,值如果只有一个应取名为value,如果没有默认值,则default可以以省略。如上定义的注解可以用于修饰方法,运行时可以使用反射获取。

自定义注解应配合注解处理器使用,没有注解处理器,注解将没有任何意义,后续会另开篇幅讲解注解处理器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值