利用 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. RedHat7安装yum工具

    一                   RedHat7安装yum工具 1.1        查看yum是否可用 yum list yum repolist 1.2        卸载原yum rpm ...

  2. mysql远程不能连接问题

    解决Navicat无法连接到腾讯云MySQL的问题 工具/原料   Navicat phpstudy 腾讯云 Xshell6 方法/步骤   1 1.首先远程连接进入服务器,在cmd中输入mysql ...

  3. linux就该这么学.pdf

    链接:https://pan.baidu.com/s/1mhYIqgg 密码:ay0j

  4. 第二章Python入门

    第二章 Python入门 2.1.简介 Python是著名的"龟叔"(Guido van Rossum)在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言 Pytho ...

  5. 基于Ubuntu 搭建 WordPress 个人博客 - 开发者实验室 - 腾讯云

    1.准备 LAMP 环境 安装 Apache2 在终端输入该命令 ,使用 apt-get 安装 Apache2: sudo apt-get install apache2 -y 安装好后,您可以通过访 ...

  6. 【leetcode】Global and Local Inversions

    题目如下: We have some permutation A of [0, 1, ..., N - 1], where N is the length of A. The number of (g ...

  7. Ubuntu下安装CUDA8.0及nvidia驱动

    参考:https://blog.csdn.net/qq_35379989/article/details/80147630 cuda的历史版本下载地址:https://developer.nvidia ...

  8. shiro框架学习-4- Shiro内置JdbcRealm

    1.  JdbcRealm 数据库准备 JdbcRealm就是用户的角色,权限都从数据库中读取,也就是用来进行用户认证授权的安全数据源更换为从数据库中读取,其他没有差别,首先在数据库创建三张表: CR ...

  9. android出现backtrace 定位方法

  10. k8s的node节点,执行kubectl get XXX报错

    报错现象: [root@localhost ~]# kubectl get nodes The connection to the server localhost:8080 was refused ...