利用 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 注解的更多相关文章

  1. java语言特性概述

    一.前言 我们都知道java是面向对象的编程,其中四个基本特性:抽象.封装.继承.多态.这四个特性,概括起来可以这么理解,抽象.封装.继承是多态的基础,多态是抽象.封装.继承的表现. 二. JAVA ...

  2. [原]Java修炼 之 基础篇(一)Java语言特性

    学习软件开发,首先要选择的就是选择需要采用的编程语言,考虑语言本身的优缺点和实际需求,综合评价之后选择相关的语言进行系统开发.本篇博客开始就从近年来比较流行的Java开始为大家讲起. 背景 1995年 ...

  3. Java 语言特性

    介绍以下几种语言特性: Java5的特性 1.静态引用 2.可变参数 3.自动装箱和拆箱  包装类的缓存设计 4.枚举 一.静态引用(语法糖,不推荐使用,了解一下即可) 先看看普通的引用,就是impo ...

  4. Java语言特性

    Java的语言特性: 1.语法相对简单 2.面向对象 3.分布性 4.可移植性 5.安全性 6.健壮性 7.解释性 8.多线程 9.动态性与并发性 Java中的面向对象编程: 面向对象程序设计(Obj ...

  5. Java语言特性、加载与执行

    [开源.免费.纯面向对象.跨平台] 简单性: 相对而言,例如,Java是不支持多继承的,C++是支持多继承的,多继承比较复杂:C++ 有指针,Java屏蔽了指针的概念.所以相对来说Java是简单的. ...

  6. 【servlet3.0新特性】Annotation注解配置

    servlet3.0新特性Servlet3.0引入的若干重要新特性,包括异步处理.新增的注解支持.可插性支持等等,为读者顺利向新版本过渡扫清障碍.Servlet3.0新特性概述Servlet3.0作为 ...

  7. 【JAVA - 基础】之Annotation注解浅析

    注解在JAVA中,尤其是一些ORM框架(如Hibernate等)中是比较常用的一种机制. 注解是JAVA 1.5之后引入的新功能,正确来说是反射的一部分,没有反射,注解也就无法正常使用.注解可以理解成 ...

  8. JAVA高级特性反射和注解

    反射: 枚举反射泛型注解.html34.3 KB 反射, 主要是指通过类加载, 动态的访问, 检测和修改类本身状态或行为的一种能力, 并能根据自身行为的状态和结果, 调整或修改应用所描述行为的状态和相 ...

  9. 【Java语言特性学习之六】扩展知识点

    一.SPI机制 二.注解处理机制 三.java native关键字 https://www.cnblogs.com/KingIceMou/p/7239668.html

随机推荐

  1. Qt Creator 4.9 发布

    Qt Creator 4.8中引入了语言服务器协议支持,允许Qt Creator通过利用此标准轻松支持更多编程语言,使IDE和其他编程工具可以轻松地获得通用编程语言支持的交换格式.使用Qt Creat ...

  2. [转载]克服FPGA I/O引脚分配挑战--xilinx系列

    转载走,放到自己的分类中好了 原文地址:I/O引脚分配挑战--xilinx系列">克服FPGA I/O引脚分配挑战--xilinx系列作者:方槍槍 http://www.eefocus ...

  3. java数据结构复习01

    1.数组 package javaDataStruct.array01; public class MyArray { private int[] arr; // 表示有效数据的长度 private ...

  4. 约会 Rendezvous:基环树

    提炼:tarjan判环,dfs建树,倍增lca,预处理环两点间距离 我犯的错误: 1.基环树不只有一棵,可以有很多 2.自环不能将其忽略,(对于我的算法)应该将其特殊考虑在算法内 3.代码一定要简洁有 ...

  5. Vue使用 weui picker 弹出框不消失

    前言 最近使用 weui 里面的 datepicker 组件的时候遇到了一个问题: 弹出来 选择年月日的框之后,直接点击导航上的“返回” 按钮,picker 选框不消失,也就是弹出框不消失 weui. ...

  6. VirtualBox导入VmWare生成的.vmdk格式虚拟机镜像

    VmWare默认的镜像格式是.vmdk格式的,VirtualBox则默认是.vdi格式的.其实这在VirtualBox新建虚拟机的过程中是可选的. 导入.vmdk格式的镜像到VirtualBox只需要 ...

  7. eclipse修改代码后都需要clean的解决办法

    问题描述: 用STS(类似于Eclipse)正在开发一个JavaWeb项目,但不知怎么的有一天,修改完Java代码,点击运行Tomcat,发现根本没有修改.刚刚开始的时候,因为一开始没找到原因而且工期 ...

  8. mysql8.0.16操作记录

    mysql8.0.16操作记录 2.1.登录 -uroot -p'AnvcTMagdLarwNV3CKaC' mysql: [Warning] Using a password on the comm ...

  9. JS几种数组遍历方式总结

    JS数组遍历的几种方式 JS数组遍历,基本就是for,forin,foreach,forof,map等等一些方法,以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比 第一种:普通for循环 代 ...

  10. PHP基础教程 php 网络上关于设计模式一些总结

    1.单例模式 单例模式顾名思义,就是只有一个实例.作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的要点有三个: 一是某个类只能有一个实例; 二 ...