Java 语言特性之 Annotation 注解
利用 Java 的反射机制,可以在运行时获取 Java 类的注解信息。
注解
注解的特性
注解是 Java 5 的一个新特性,是插入代码中的一种注释或者说是元数据。注解并不是程序代码,可以对程序作出解释,类似于注释。但是注解可以被相关程序读取(例如编译器)。
注解可以用在两个时刻:
- 在编译期间,编译工具会对注解进行处理
- 在运行期间,使用 Java 反射机制进行处理
注解格式及用法
注解的格式:注解以 @
开头,后面跟注释名,还可以加参数。
注解使用的地方:package,class,method,field 上都可以使用注解。
- 类注解:
@MyAnnotation(name="someName", value = "Hello World")
public class TheClass {
}
- 方法注解:
@Override
public String toString() { // 这里如果方法名写错,会报错
return "";
}
注解的定义
注解的定义与接口的定义相似,但是需要在 interface 关键字前加 @
符号:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
元注解 meta-annotation
元注解负责注解其他注解。Java 定义了4个标准的元注解类型,用来对其它 注解类型作说明:
@Target
@Target
用于描述注解的使用位置。例如 @Target(ElementType.TYPE)
表示这个注解只能用在类型上面(比如类跟接口)。参数可以同时指定多个值,例如@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
。ElementType 的可用值有:
- CONSTRUCTOR:用于构造器
- FIELD:用于字段
- LOCAL_VARIABLE:用于局部变量
- METHOD:用于方法
- PACKAGE:用于包
- PARAMETER:用于参数
- TYPE:用于类、接口(包括注解类型) 或enum声明
@Retention
@Retention
用于描述注解的生命周期。可取值有:
- SOURCE:在源文件中有效,编译时丢弃
- CLASS:在class文件中有效,运行时丢弃
- RUNTIME:在运行时有效
@Documented
@Documented
用于描述是否可以被 javadoc 之类的工具文档化。@Documented
是标记注解,没有成员。
@Inherited
@Inherited
用于描述某个被标注的类型是被继承的。如果一个使用了 @Inherited
修饰的annotation类型被用于一个class,则这个注解将被用于该class的子类。
当@Inherited 类型标注的注解的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用 java.lang.reflect 反射机制去查询一个@Inherited 类型的注解时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。
内置注解
@Override
定义在 java.lang.Override
中,此注解只能用于修饰方法,表示重写父类中的方法。
@Deprecated
定义在 java.lang.Deprecated
中,可以用于修饰方法、属性或类,表示方法、属性或类已经废弃,不建议使用。
@SuppressWarnings
定义在 java.lang.SuppressWarnings
中,抑制编译时的警告信息。可以指定以下的一个或多个参数,例如 `@SuppressWarngins(value={“unchecked”, “path”}):
- all:抑制所有警告
- deprecate:抑制废弃方式、属性或类的警告
- unchecked:抑制未检查的警告,例如使用集合时未指定泛型
- path:路径、文件不存在的警告
- finally:抑制 finally 子句不能完成时的警告
自定义注解
使用 @interface
自定义注解时,自动继承 java.lang.annotation.Annotation
接口。注解不能继承其他的注解或接口。
@interface
用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本数据类型(int,float,boolean,byte,double,char,long,short)、Class、String、enum 及这些类型对应的数组)。可以通过default来声明参数的默认值。
定义注解的语法:
public @interface 注解名 {定义体}
- 例如,注解使用:
@MyAnnotation(name="someName", value = "Hello World")
public class TheClass {
}
- 注解定义:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation {
public String name();
public String value();
}
访问注解
只要是 Runtime 级别的注解,不管是类、方法、参数、变量注解都可以在运行时通过反射机制加载类后,进行访问,具体方法可以参考 这里。
Class aClass = TheClass.class;
Annotation annotation = aClass.getAnnotation(MyAnnotation.class);
if(annotation instanceof MyAnnotation){
MyAnnotation myAnnotation = (MyAnnotation) annotation;
System.out.println("name: " + myAnnotation.name());
System.out.println("value: " + myAnnotation.value());
}
Java 语言特性之 Annotation 注解的更多相关文章
- java语言特性概述
一.前言 我们都知道java是面向对象的编程,其中四个基本特性:抽象.封装.继承.多态.这四个特性,概括起来可以这么理解,抽象.封装.继承是多态的基础,多态是抽象.封装.继承的表现. 二. JAVA ...
- [原]Java修炼 之 基础篇(一)Java语言特性
学习软件开发,首先要选择的就是选择需要采用的编程语言,考虑语言本身的优缺点和实际需求,综合评价之后选择相关的语言进行系统开发.本篇博客开始就从近年来比较流行的Java开始为大家讲起. 背景 1995年 ...
- Java 语言特性
介绍以下几种语言特性: Java5的特性 1.静态引用 2.可变参数 3.自动装箱和拆箱 包装类的缓存设计 4.枚举 一.静态引用(语法糖,不推荐使用,了解一下即可) 先看看普通的引用,就是impo ...
- Java语言特性
Java的语言特性: 1.语法相对简单 2.面向对象 3.分布性 4.可移植性 5.安全性 6.健壮性 7.解释性 8.多线程 9.动态性与并发性 Java中的面向对象编程: 面向对象程序设计(Obj ...
- Java语言特性、加载与执行
[开源.免费.纯面向对象.跨平台] 简单性: 相对而言,例如,Java是不支持多继承的,C++是支持多继承的,多继承比较复杂:C++ 有指针,Java屏蔽了指针的概念.所以相对来说Java是简单的. ...
- 【servlet3.0新特性】Annotation注解配置
servlet3.0新特性Servlet3.0引入的若干重要新特性,包括异步处理.新增的注解支持.可插性支持等等,为读者顺利向新版本过渡扫清障碍.Servlet3.0新特性概述Servlet3.0作为 ...
- 【JAVA - 基础】之Annotation注解浅析
注解在JAVA中,尤其是一些ORM框架(如Hibernate等)中是比较常用的一种机制. 注解是JAVA 1.5之后引入的新功能,正确来说是反射的一部分,没有反射,注解也就无法正常使用.注解可以理解成 ...
- JAVA高级特性反射和注解
反射: 枚举反射泛型注解.html34.3 KB 反射, 主要是指通过类加载, 动态的访问, 检测和修改类本身状态或行为的一种能力, 并能根据自身行为的状态和结果, 调整或修改应用所描述行为的状态和相 ...
- 【Java语言特性学习之六】扩展知识点
一.SPI机制 二.注解处理机制 三.java native关键字 https://www.cnblogs.com/KingIceMou/p/7239668.html
随机推荐
- “12306”是如何支撑百万QPS的?
来源:掘金 作者:绘你一世倾城 链接:https://juejin.im/post/5d84e21f6fb9a06ac8248149 秒杀系统的艺术 12306抢票,极限并发带来的思考? 每到节假日期 ...
- SpringFramework中的BeanWrapper丶PropertyEditor
BeanWrapper是org.springframework.beans包下的一个借口,对应的实现类为BeanWrapperImpl,提供对应的get/set方法,并且设置属性的可读性和可写性. p ...
- ZROI 19.08.01 生成函数方法
写在前面:由于我数学基础不好,加上缺乏生成函数知识,所以这一下午我都处在掉线和非掉线的叠加态.而且我写\(\LaTeX\)很慢,所以笔记相当混乱而且不全面.说白了就是我太菜了听不懂. 1.一般生成函数 ...
- ERROR 1040 (08004): Too many connections
ERROR 1040 (08004): Too many connections 长期一来,mysql低版本中,当面对连接数陡增而出现too many connections时,往往比较棘手.今天特意 ...
- 数据结构-STL序列式容器总结
根据序列在容器中的排列特性,将常见数据结构分为:序列式容器和关联式容器. 常见序列式容器有 1.array(build-in)c++內建 2.vector 3.heap(以算法方式呈现) 4.prio ...
- nmon监控使用
1.上传nmon_linux_x86_64文件到服务器 2.修改文件权限chmod 775 nmon_linux_x86_64 3.压测时需要执行以下命令监控服务器./nmon_linux_x86_6 ...
- java+web+大文件上传下载
文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...
- ubuntu 安装 tar.gz 文件
ubuntu 安装 tar.gz 文件 本文链接:https://blog.csdn.net/caloriesung/article/details/81536144 tar zxvf FileNam ...
- ubuntu下恢复被rm删除的文件
ubuntu是文件系统,不像windows系统划分盘符(C/D/E/etc...盘).ubuntu对磁盘划分分区,可以使用extundelete恢复ext3/ext4格式的磁盘分区. 其中,ext3/ ...
- wannafly 练习赛10 f 序列查询(莫队,分块预处理,链表存已有次数)
链接:https://www.nowcoder.net/acm/contest/58/F 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 262144K,其他语言524288K 64 ...