Java系列之注解
Java系列之注解
Java 注解(Annotation)又称之为 Java 标注、元数据,是 Java 1.5 之后加入的一种特殊语法,通过注解可以标注 Java 中的类、方法、属性、参数、包等,可以通过反射原理对这些元数据进行访问,注解的使用不会影响程序的正常运行,只会对编译器警告等辅助工具产生影响
注解功能
- 编译器可以使用注解来检测错误和取消警告;
- 使用注解可以生成特定代码,如 ButtferKnife 使用注解简化 findViewById等;
- 某些注解可以在运行时进行检查和操作。
注解定义
注解的定义使用 @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 {
}
最新文章
- save(),saveOrUpdate(),merge()的区别
- django xadmin自定义菜单
- C# RSA 算法
- JAVA使用DES加密算法加密解密
- 有关javascript中的JSON.parse和JSON.stringify的使用一二
- C#简单多线程使用(同步和优先权)
- Android中如何像 360 一样优雅的杀死后台服务而不启动
- Cross-origin resource sharing--reference
- linux 下的对拍
- Unity 单元测试(NUnit,UnityTestTools)
- UVA 10718 Bit Mask 贪心+位运算
- 不带parent指针的successor求解
- 两个案例轻松理解MyBatis中的TypeHandler!
- Mybatis返回HashMap时,某个字段值为null时,不会保存key
- VS2010安装msdn本地帮助
- zk使用原理
- C# NPOI 导出Execl 工具类
- js-数组中查找特定元素并返回所有该元素的索引
- 永久激活navicat_premium12.0,支持win32和64位
- SSIS中出现数据流数据源假死状态的解决办法
热门文章
- 记录工作中linux相关操作
- python接口测试(post,get)-传参(data和json之间的区别)
- [Linux] Telnet提示:Unable to connect to remote host: No route to host
- 【linux】【Fabric】Centos7搭建Fabric运行环境
- 浅谈 Vector
- 微信小程序中的tabBar设置
- 转:查看oracle数据库允许的最大连接数和当前连接数
- Android Studio [RecyclerView/瀑布流显示]
- Android Studio [ImageView/使用第三方库加载图片]
- Spring 梳理-bean作用域