一、注解中的信息已经在Class中了,我们应该如何读取出来

1 java.lang.reflect.AnnotatedElement接口:2

3 publicAnnotation[] getAnnotation(Class annotationType);4

5 publicAnnotation[] getDeclaredAnnotations();6

7 public Boolean isAnnotationPresent(Class annotationType);

View Code

Class 、Constructor、Field、Method、Package等类别,都实现了AnnotatedElement接口,既然Class 、Constructor、Field、Method、Package等类别,都实现了AnnotatedElement接口,显然它们都可以去调用AnnotatedElement里面的方法,以上各方法是定义在这个接口中的,定义Annotation时必须设定RententionPolicy为RUNTIME,也就是可以在VM中读取Annotation信息

二、通过反射的方式读取作用在类、方法上面所修饰的注解信息。

1、public boolean isAnnotationPresent(Class extends Annotation> annotationClass)

这句代码表示:annotationClass指定的注解,如果存在于方法的上面,就返回一个true,这个方法主要是用来判断某个方法上面是否存在注解。

2、public T getAnnotation(Class annotationClass)

会返回一个Annotation这样一个对象,参数里边儿是一个具体的Annotation Class对象,如果这样一个Annotation存在的话,才会返回这个Annotation。否则返回一个空值

3、Class extends Annotation> annotationType()

返回注解所对应的Class对象。

三、限定annotation使用对象

@Target

使用java.lang.annotation.Target可以定义其使用之时机,就是限定可以在什么地方可以使用注解:如方法、类、成员属性、变量,在定义时要指定java.lang.annotation.ElementType的枚举值之一,以此来表示这个注解可以修饰哪些目标。

package java.lang.annotation

public Enum ElementType{

TYPE,//适用class,interface,enum

FIELD,//适用field

METHOD,//适用method

PARAMETER,//适用method之上的parater

CONSTTRUCTOR,//适用constructor

LOCAL_VARIABLE,//适用局部变量

ANNOTATION_TYPE,//适用annotation型态

PACKAGE//适用package

}

1 packagecom.javase.annotation;2 importjava.lang.annotation.ElementType;3 importjava.lang.annotation.Target;4 /**

5 * 自定义一个注解,这个注解只能修饰方法6 *@authorx_xiongjie7 *8 */

9 @Target(ElementType.METHOD)10 public @interfaceMyTarget {11 String value();12 }13

14 packagecom.javase.annotation;15

16 public classMyTargetTest {17 @MyTarget(value="zhangsan")18 public voiddoSomething(){19 System.out.println("hello world");20 }21 }

View Code

四、要求为API文件@Documented

在制作JavaDoc文件的同时,如果想要将Annotation的内容也加入到API文件中,需要使用java.lang.annotation.Documented,则在在生成java doc的时候,将注解信息也生成到java doc中。

1 packagecom.javase.annotation;2 importjava.lang.annotation.Documented;3

4 @Documented5 public @interfaceDocumentedAnnotation {6 String hello();7 }8 packagecom.javase.annotation;9

10 public classDocumentedTest {11 @DocumentedAnnotation(hello="welcome")12 public voidmethod(){13 System.out.println("helloworld");14 }15 }

View Code

五、@Inherited

在定义Annotation时加上java.lang.annotation.Inherited形态的Annotation,Inherited表示一个注解信息是否可以被自动继承下来,如果在注解中加上Inherited注解,就会由父类中被子类继承下来。

六:总结

1、要知道注解的本源是什么,如何去定义注解。

2、如何使用反射的方式去解析注解的信息,并且去解析注解下面所修饰的类、方法。根据注解是否存在注解的值到底是什么,来去调用对应的方法,或者处理对应的类。这个是很重要的,将RetentionPolicy设置为RUNTIME就可以得到。

3、元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:

1.@Target,

2.@Retention,

3.@Documented,

4.@Inherited

这些类型和它们所支持的类在java.lang.annotation包中可以找到。

4、@Target:

@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循 环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

取值(ElementType)有:

1.CONSTRUCTOR:用于描述构造器

2.FIELD:用于描述域

3.LOCAL_VARIABLE:用于描述局部变量

4.METHOD:用于描述方法

5.PACKAGE:用于描述包

6.PARAMETER:用于描述参数

7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

5、@Retention:

@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class 被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta- Annotation可以对 Annotation的“生命周期”限制。

作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

取值(RetentionPoicy)有:

1.SOURCE:在源文件中有效(即源文件保留)

2.CLASS:在class文件中有效(即class保留)

3.RUNTIME:在运行时有效(即运行时保留)

Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。

6、@Documented:

@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

7、@Inherited:

@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继 承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现, 或者到达类继承结构的顶层。

8、自定义注解:

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成 其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就 是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认 值。

定义注解格式:

public @interface 注解名 {定义体}

注解参数的可支持数据类型:

1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)

2.String类型

3.Class类型

4.enum类型

5.Annotation类型

6.以上所有类型的数组

Annotation类型里面的参数该怎么设定:

第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;

第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和

String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String

value();这里的参数成员就为String;

第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。

9、注解元素的默认值:

注解元素必须有确定的值,要么在定义注 解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此, 使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为每个注解的声明中,所有元素都存在,并且都具 有相应的值,为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或者负数,一次表示某个元素不存在,在定义注解时,这已经成为一个习惯用法。

java注解机制_Java 注解机制相关推荐

  1. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

  2. Java注解库_Java 注解详解

    本文部分摘自 On Java 8 基本语法 注解是 Java 5 所引入的众多语言变化之一,是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影 ...

  3. java 注解使用_Java 注解用法

    Java 注解用法 1.简述 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) 与程序元素(类.方 ...

  4. java method 注释_Java注解

    Java注解 注解概述 3.注解 3.1.注解,或者叫做注释类型,英文单词是:Annotation 疑问:注解到底是干啥的????????? 3.2.注解Annotation是一种引用数据类型.编译之 ...

  5. java 注释 过时_Java 注解

    前言 为什么需要学习注解? 1.能够灵活地使用框架提供的注解,最后能够读懂框架的源码 2.能够配合反射将代码书写更加的灵活,更加易于维护易于扩展,Properties配置,XML配置,注解配置[Jav ...

  6. Java注解 编译_Java注解(3)-注解处理器(编译期|RetentionPolicy.SOURCE)

    注解的处理除了可以在运行时通过反射机制处理外,还可以在编译期进行处理.在编译期处理注解时,会处理到不再产生新的源文件为止,之后再对所有源文件进行编译. Java5中提供了apt工具来进行编译期的注解处 ...

  7. Java注解 编译_Java注解处理器学习之编译时处理的注解详析

    1. 一些基本概念 在开始之前,我们需要声明一件重要的事情是:我们不是在讨论在运行时通过反射机制运行处理的注解,而是在讨论在编译时处理的注解. 编译时注解跟运行时注解到底区别在什么地方?其实说大也不大 ...

  8. java 注解值_java 注解默认值操作

    我就废话不多说了,大家还是直接看代码吧~ package com.zejian.annotationdemo; import java.lang.annotation.ElementType; imp ...

  9. java uv实例_Java注解的实际应用案例讲解

    前言 注解确实是一个很强大的功能,是的开发效率大幅度提高.在Android开发中,比较有名气的注解框架当属:Butterknife.https://github.com/JakeWharton/but ...

最新文章

  1. 书评 | 如何让开发中的各种文档变活?《活文档》阅读总结
  2. javascript :得到上星期的这一天日期
  3. 如何评价NVIDIA RTX 2080 Ti显卡?
  4. 如何为服务器安装mysql数据库文件,如何为服务器安装mysql数据库
  5. Nginx 设置文件缓存时间
  6. android studio2.3.6,Android Studio 2.3 问题汇总 - 解决一切障碍,为了更好的时代
  7. Java Web架构知识整理
  8. windows优化大师怎么用_曾经辉煌的装机必备软件,你用过几个?
  9. 详细全面 :一份完整的数据分析师成长书单
  10. 智遥工作流将数据导出到Excel分析
  11. 六西格玛dfss_什么是六西格玛设计(DFSS)
  12. 构建器builder模式 + lombok @Builder的介绍及使用
  13. EventLoop(回顾)
  14. 关于抱怨解读,读书笔记
  15. 【路径规划-TSP问题】基于粒子群结合蚁群算法求解旅行商问题附matlab代码
  16. 鄙人从事IT业已经有9年时间,少壮不努力,长大搞IT
  17. 【动作】Cocosd-x3.x 动作类归纳
  18. 深入分析泰坦尼克号分析生存率
  19. 常见的信号平滑处理方法
  20. 【通义听悟】音视频内容AI效率工具(包含公测福利)

热门文章

  1. 寒冰linux视频教程笔记5 过滤器、输入输出及管道
  2. word2vec模型评估_干货 | NLP中的十个预训练模型
  3. 训练和验证准确性_通过沉浸式虚拟现实观察动作增强运动想象训练
  4. android 导入sqlite文件怎么打开,如何将sqlite文件导入到我的项目中?
  5. 老毛子固件插件_原地升值?newifi 3 路由器刷入高恪固件教程
  6. 计算机算法对程序设计的作用,计算机编程中数学算法的优化策略
  7. oracle找到引起账户锁定的ip,Oracle 找到引起账户锁定的IP
  8. 简书 java jvm_JVM介绍
  9. 智能车竞赛技术报告 | 双车接力组 - 沈阳航空航天大学 - 精神小车成双 - 双轮车
  10. 第十六届智能车竞赛广东线上比赛 - 哈尔滨工业大学(深圳)比赛筹备