Java系列之注解

Java 注解(Annotation)又称之为 Java 标注、元数据,是 Java 1.5 之后加入的一种特殊语法,通过注解可以标注 Java 中的类、方法、属性、参数、包等,可以通过反射原理对这些元数据进行访问,注解的使用不会影响程序的正常运行,只会对编译器警告等辅助工具产生影响

注解功能

  1. 编译器可以使用注解来检测错误和取消警告;
  2. 使用注解可以生成特定代码,如 ButtferKnife 使用注解简化 findViewById等;
  3. 某些注解可以在运行时进行检查和操作。

注解定义

注解的定义使用 @interface 作为关键字,实际上表示自动继承了 java.lang.annotation.Annotation 接口,定义格式参考如下:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthValidators { @AliasFor("value")
AuthValidator[] validators() default {};
}

内置注解

  • @Override 表示当前的方法将覆盖超类中的方法,编译时进行格式检查
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {
    }
  • @Deprecated 表示一个类或者是方法不再建议使用,将其标记为过时,但还是可以使用
    @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface SuppressWarnings {
    String[] value();
    }
  • @SuppressWarnings 表示关闭不当的编译器警告信息
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
    public @interface Deprecated {
    }

元注解

  • @Target
  • @Retention
  • @Documented
  • @Inherited

@Target

@Target 用来描述注解的使用范围,它的申明如下

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

由 @Target 声明可知使用 @Target 注解必须指定具体的 Java 成员,也就是该注解要使用到哪个位置,具体由枚举 ElementType 中定义,具体如下:

public enum ElementType {
TYPE, //类、接口、注解、枚举
FIELD, //属性(包括枚举常量)
METHOD, //方法
PARAMETER, //参数
CONSTRUCTOR, //构造方法
LOCAL_VARIABLE, //局部变量
ANNOTATION_TYPE,//注解
PACKAGE, //包 /**
* 类型注解
* @since 1.8
*/
TYPE_PARAMETER,
TYPE_USE
}

@Retention

@Retention 表示在什么级别保存该注解的信息,它的声明如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
* Returns the retention policy.
* @return the retention policy
*/
RetentionPolicy value();
}

由 @Retention 的声明可知,使用 @Retention 时,必须指定保存celue(RetentionPolicy),具体值如下:

public enum RetentionPolicy {
SOURCE, //在编译时会被丢弃,仅仅在源码中存在
CLASS, //默认策略,运行时就会被丢弃,仅仅在 class 文件中
RUNTIME //编译时会将注解信息记录到class文件,运行时任然保留,可以通过反射获取注解信息
}

@Documented & @Inherted

@Documented 和 @Inherited 都没有配置参数,是一种标记注解,@Documented 表示将该注解显示到用户文档中,@Inherited 表示该注解只有使用在类上才会有效,而且该注解会被子类继承。

类型注解

在对元注解的说明中可知从 Java8 开始新增了类型注解,如果在注解 @Target 使用这种注解,表明该注解可以在对应的任何地方使用,如在 @Target 中指定 TYPE_PARAMETER 就可在自定义类型的声明处使用该注解,如在 @Target 中指定 TYPE_USE 就可在任何类型前添加该类之间,主要是方便 Java 开发者使用类型注解和相关插件(Checker Framework)来检查来在编译期检查运行时的异常

下面分别定义指定 TYPE_PARAMETER 和 TYPE_USE 的注解,具体如下:

//1. TYPE_PARAMETER
@Target(value = {ElementType.TYPE_PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface TypeParameterAnnotation {
String value();
}
//2. TYPE_USE
@Target(value = ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TypeUseAnnotation {
}

最新文章

  1. save(),saveOrUpdate(),merge()的区别
  2. django xadmin自定义菜单
  3. C# RSA 算法
  4. JAVA使用DES加密算法加密解密
  5. 有关javascript中的JSON.parse和JSON.stringify的使用一二
  6. C#简单多线程使用(同步和优先权)
  7. Android中如何像 360 一样优雅的杀死后台服务而不启动
  8. Cross-origin resource sharing--reference
  9. linux 下的对拍
  10. Unity 单元测试(NUnit,UnityTestTools)
  11. UVA 10718 Bit Mask 贪心+位运算
  12. 不带parent指针的successor求解
  13. 两个案例轻松理解MyBatis中的TypeHandler!
  14. Mybatis返回HashMap时,某个字段值为null时,不会保存key
  15. VS2010安装msdn本地帮助
  16. zk使用原理
  17. C# NPOI 导出Execl 工具类
  18. js-数组中查找特定元素并返回所有该元素的索引
  19. 永久激活navicat_premium12.0,支持win32和64位
  20. SSIS中出现数据流数据源假死状态的解决办法

热门文章

  1. 记录工作中linux相关操作
  2. python接口测试(post,get)-传参(data和json之间的区别)
  3. [Linux] Telnet提示:Unable to connect to remote host: No route to host
  4. 【linux】【Fabric】Centos7搭建Fabric运行环境
  5. 浅谈 Vector
  6. 微信小程序中的tabBar设置
  7. 转:查看oracle数据库允许的最大连接数和当前连接数
  8. Android Studio [RecyclerView/瀑布流显示]
  9. Android Studio [ImageView/使用第三方库加载图片]
  10. Spring 梳理-bean作用域