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 {
}
Java系列之注解的更多相关文章
- 细说java系列之注解
写在前面 Java从1.5版本之后开始支持注解,通过注解可以很方便地实现某些功能,使用得最普遍的就是Spring框架的注解,大大简化了Bean的配置. 注解仅仅是一种Java提供的工具,并不是一种编程 ...
- java基础解析系列(六)---注解原理及使用
java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及 ...
- springBoot系列-->springBoot注解大全
一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration ...
- Java系列笔记(0) - 目录和概述
笔者在开发过程中发现自己基础太薄弱,读书时除了系统学习了一下Java的基础语法和用法.一点简单的数据结构和设计模式之外,再无深入系统的学习,而工作中的学习也是东晃一枪西晃一枪,不够扎实和系统.想到一个 ...
- 【JAVA系列】Google爬虫如何抓取JavaScript的?
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[JAVA系列]Google爬虫如何抓取Java ...
- java中的注解(Annotation)
转载:https://segmentfault.com/a/1190000007623013 简介 注解,java中提供了一种原程序中的元素关联任何信息.任何元素的途径的途径和方法. 注解是那些插入到 ...
- Java系列笔记(2) - Java RTTI和反射机制
目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...
- Java系列笔记(4) - JVM监控与调优
目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例 光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之.通过学习,我觉得JVM ...
- Java系列笔记(3) - Java 内存区域和GC机制
目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...
随机推荐
- 即时聊天APP(六) - 消息的接收以及EventBus使用
通常我们在接收消息的时候会有声音和震动的提示,因此我也加了代码达到这样的效果,这就要用到EventBus了,当然这里我也用到了自定义的广播,所以首先在Mainfests文件中加入以下代码: <r ...
- Spring Boot(一) Hello World
一.Spring Boot之我见 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从 ...
- [VB.NET Tips]字符串转换为日期
有些字符串需要转换成日期,或者整型转换为日期,可以参考如下思路: Dim result As Date Dim source As String = "20190515" resu ...
- mysql8.0版本忘记root密码
1.先关掉系统服务 net stop mysql 2.进入mysql安装目录的bin文件中,以管理员的方式运行cmd,然后输入如下命令,实现无密码登陆 mysqld --console --skip- ...
- python的pywinrm模块远程连接windows执行dos命令
----A机器远程连接B---- 在A机器上安装模块: pip install pywinrm 在B机器上配置winrm服务的相关配置,使其支持远程控制: (winrm服务是windows 一种方便远 ...
- 微信小程序开发简述
微信小程序简述 什么是微信小程序? 微信小程序,简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用.全面开放 ...
- Python学习笔记整理总结【Django】Ajax
一.Ajax(part1) Ajax即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术,AJAX = ...
- linux centos安装zabbix 4.0服务端
1.服务器安装docker sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manag ...
- .Net Core 跨平台:一个简单程序的多平台(windows、Linux、osx)发布
.Net Core 跨平台:一个简单程序的多平台(windows.Linux.osx)发布 .Net Core 3.0 已于2019年9月23日发布了,包含了一些新特性,具体参见Announcing ...
- 【ADO.NET-中级】百万级数据的批量插入的两种方法测试
在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量 ...