首页 > 编程语言 > 详细

Java注解(Annotation)

时间:2021-03-30 09:34:01      阅读:21      评论:0      收藏:0      [点我收藏+]

Java 注解(Annotation)又称 Java 标注

Java语言中的类、方法、变量、参数和包等都可以被标注。

和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容

 

一、内置的注解

Java定义了一套注解,共有七个,三个在java.lang中,四个在java.lang.annotation中。

作用在代码的注解:

  • @Override:检查该方法是否是重写方法。如果发现其父类或是引用的接口中并没有该方法时,会报编译错误。
  • @Deprecated:标记过时方法。如果使用该方法,会报编译警告。
  • @SuppressWarnings:指示编译器忽略注解中声明的警告

作用在其他注解的注解(即元注解):

  • @Retention:标注这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问
  • @Documented:标记这些注解是否包含在用户文档中
  • @Target:标记这个注解应该是哪种Java成员
  • @Inherited:标记这个注解是继承于哪个注解类(默认注解并没有继承于任何子类)

额外增加的注解:

  • @SafeVarargs:Java7开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告
  • @FunctionnalInterface:Java8开始支持,标识一个匿名函数或函数式接口
  • @Repeatable:Java8开始支持,标识某注解可以在同一个声明上使用多次

 

二、Annotation架构

技术分享图片

 

 由此看出:

每一个Annotation对象和Annotation的实现类,都会有唯一的RetentionPolicy属性,可以有若干个ElementType属性

 

Annotation.java

package java.lang.annotation;
public interface Annotation {

    boolean equals(Object obj);

    int hashCode();

    String toString();

    Class<? extends Annotation> annotationType();
}

Annotation就是个接口

 

ElementType.java

package java.lang.annotation;

public enum ElementType {
    /**标明该注解可以用于类、接口(包括注解类型)或enum声明*/
    TYPE,

    /** 标明该注解可以用于字段(域)声明,包括enum实例 */
    FIELD,

    /** 标明该注解可以用于方法声明 */
    METHOD,

    /** 标明该注解可以用于参数声明 */
    PARAMETER,

    /** 标明注解可以用于构造函数声明 */
    CONSTRUCTOR,

    /** 标明注解可以用于局部变量声明 */
    LOCAL_VARIABLE,

    /** 标明注解可以用于注解声明(应用于另一个注解上)*/
    ANNOTATION_TYPE,

    /** 标明注解可以用于包声明 */
    PACKAGE,

    /**
     * 标明注解可以用于类型参数声明(1.8新加入)
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * 类型使用声明(1.8新加入)
     * @since 1.8
     */
    TYPE_USE

    private ElementType() {
    }
}

ElementType是enum枚举类型,它用来指定Annotation的类型

 

RetentionPolicy.java

package java.lang.annotation;
public enum RetentionPolicy {
    SOURCE,            /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了  */

    CLASS,             /* 编译器将Annotation存储于类对应的.class文件中。默认行为  */

    RUNTIME            /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}

RetentionPolicy是enum枚举类型,它用来指定Annotation的策略。通俗地说,不同RetentionPolicy类型的Annotation的作用域不同

 

三、自定义Annotation

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

(1)@interface:使用@interface定义注解时意味着它实现了java.lang.annotation.Annotation接口,即该注解就是一个Annotation。

  定义Annotation时,@interface是必须的。

  注意:它和我们通常的implements实现接口不同,Annotation接口的实现细节都由编译器完成。通过@interface定义注解后,该注解不能继承其他的注解或接口。

 

Java注解(Annotation)

原文:https://www.cnblogs.com/tang321/p/14594671.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!