打开 Eclipse,新建 Java 项目“注解与反射”,在 src 下右键并建立包 “注解与反射”,在包下右键并建立 Annotation (注解)文件,名称为“ItAnnotation”。

注解与反射调用

ItAnnotation.java 文件package 注解与反射;

public @interface ItAnnotation {

}

以上就是一个注解文件。然后再新建一个 class 文件,取名为“TestAnnotation”

TestAnnotation.java 文件public class TestAnnotation {

public static void main(String[] args) {

}

}

然后在类的上方加上 “@ItAnnotation”,并在 main 方法中检查注解是否存在。我们知道java代码编译后其实是一个以 class 文件存放。检查的方法就是TestAnnotation.class.isAnnotationPresent(ItAnnotation.class)

如图所示:

如果 TestAnnotation 方法上方存在该注解则进行下一步操作,获取该方法指定类型的注解,代码如下:ItAnnotation annotation = (ItAnnotation)TestAnnotation.class.getAnnotation(ItAnnotation.class);

然后打印输出 annotation 查看究竟,如图所示:

实际上什么都没有打印,这是为什么呢?我们切换到 ItAnnotation.java 文件,给注解添加一个元注解。我们知道“元”这个字往往是这个意思,注解的注解就是元注解,专门给注解服务的注解。

在注解的上方添加一个 @Retention(RetentionPolicy.RUNTIME) 表示修饰下方的注解始终不会丢弃,运行期间也保留该注解。如图所示:

现在再次运行,就会打印出:@注解与反射.ItAnnotation()

这边引出了个概念,@Retention(RetentionPolicy.RUNTIME)的意思是运行时不丢弃,也就是说注解是会被丢弃的,那么注解到底在什么时候会被丢弃呢?其实还有另外两个关于 @Retention 元注解的生命周期分别如下:RetentionPolicy.SOURCE 编译阶段就丢弃,不会生成在 class 文件里

RetentionPolicy.CLASS 在生成 class 文件的时候,会保留在 class 文件里

现在对 @Retention 元注解有一点概念了,那么还有其他的元注解么?有,接下来接触的就是 @Target,它的作用是他修饰的注解可以用在什么地方,也就是可以在哪个代码块区域的上方使用。如果不加 @Target 的话就是任何地方都可以用。ElementType.TYPE: 用于类、接口、枚举(TYPE实际上是 class 的父级)

ElementType.FIELD:

ElementType.METHOD 用于方法

ElementType.PARAMETER

ElementType.CONSTRUCTOR

ElementType.LOCAL_VARIABLE

ElementType.ANNOTATION_TYPE

ElementType.PACKAGE

切换回 ItAnnotation.java 文件,试着加上 @Target(ElementType.METHOD)第二个元注解,如图所示:

然后切换回“TestAnnotation.java” 文件你会发现 IDE 报错了,把 “@ItAnnotation” 移动到 main 方法上方,错误就消失了。那是因为 ElementType.METHOD 只能用于方法。

我们将 @Target 进行修改,让它能够多选,一般来讲多选都是在括号里面加个大括号,改为 @Target({ElementType.METHOD,ElementType.TYPE}) ,这样就可以同时用于类和方法上。

为注解增加一些属性

其实这个注解很像接口,我们在里面定义的相当于抽象方法。定义一个 String name(),记住 Ctrl+S 保存代码。代码如下:

ItAnnotation.java 文件......

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.METHOD,ElementType.TYPE})

public @interface ItAnnotation {

String name(); //增加一个字符串的属性

}

切换回 “TestAnnotation.java” 可以发现两个 @ItAnnotation 均报错,我们先删除main方法上方的注解,然后在注解后方加上括号填入属性值: @ItAnnotation(name = "小明"),最后在这个文件 main 方法中之前通过 ItAnnotation annotation 获取的对象调用该方法:annotation.name(),如下图所示:

TestAnnotation.java 文件

再次运行,控制台会输出“小明”。

有1种特殊的情况,可以在注解中省去属性名称并直接赋值。我们切换回 “ItAnnotation.java” 文件将 String name() 改为 String value(),点击保存,再在“TestAnnotation.java”文件中,将注解中的值保留,前面的属性去除:@ItAnnotation("小明"),然后将annotation.name() 改为 annotation.value() 再次运行,发现依然可以输出“小明”,这个情况是特殊的,当你定义的抽象方法为 value() 时,且只有1个的情况下,注解中可以省略属性名并直接赋值。

在拥有多个抽象方法(同时包含 value())时,直接赋值会报错,但在其他方法拥有默认值的情况下不会。切换回 “ItAnnotation.java” 文件,将抽象方法改为 String name default "小明"; ,下方在加个 String value();,完整代码如下:

ItAnnotation.java 文件@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.METHOD,ElementType.TYPE})

public @interface ItAnnotation {

String name() default "小明";

String value();

}

TestAnnotation.java 文件@ItAnnotation("ABC")

public class TestAnnotation {

public static void main(String[] args) {

//检查指定的类上方的注解是否存在

if (TestAnnotation.class.isAnnotationPresent(ItAnnotation.class)) {

//获取 ItAnnotation 类型的注解

ItAnnotation annotation = (ItAnnotation)TestAnnotation.class.getAnnotation(ItAnnotation.class);

System.out.println(annotation.name());

System.out.println(annotation.value());

}

}

}

以上代码不会报错,再次运行,输出 name 的默认值(小明)与value的值(ABC)。

java 反射 注解 运用_Java注解与反射的使用相关推荐

  1. java注解机制_Java 注解机制

    一.注解中的信息已经在Class中了,我们应该如何读取出来 1 java.lang.reflect.AnnotatedElement接口:2 3 publicAnnotation[] getAnnot ...

  2. Java注解库_Java 注解详解

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

  3. java注解编程_java 注解 基本原理 编程实现

    java 1.5开始引入了注解和反射,正确的来说注解是反射的一部分,没有反射,注解无法正常使用,但离开注解,反射依旧可以使用,因此来说, 反射的定义应该包含注解才合理一些.当然,这只是个人想法,至于j ...

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

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

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

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

  6. java 注解学习_JAVA注解学习

    什么是注解 ? [这个解释起来比较....不知道怎么解释,还是直接百度吧,不会咱就抄一抄嘛~~~] 定义一:用一个词就可以描述注解,那就是元数据,即一种描述数据的数据.所以,可以说注解就是源代码的元数 ...

  7. java 获取当前年_java中的反射(三) - kelexin

    目录一.反射1.class类2.访问字段3.调用方法4.调用构造方法5.获取继承对象6.动态代理二.sping中的反射 本篇转自:本篇内容spring中的反射 java中的反射(一): java中的反 ...

  8. java 注解传值_java注解 - Mr.yang.localhost - 博客园

    注解使用 Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能. 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang. ...

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

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

最新文章

  1. 代码和XIB结合开发
  2. linux c 文件操作
  3. 4.1.3 文件目录
  4. jenkins查询mysql_jenkins流水线使用mysql数据库
  5. 超萌哒!20000个虎年限定红包封面,限量开抢!
  6. php sql跳过前四条数据,mysql实现每组取前N条记录的sql,以及后续的组数据量限制...
  7. HashMap遍历有序性问题——map.entrySet()的无序性
  8. apache网络服务的搭建和配置
  9. 你的工具包已到货「GitHub 热点速览 v.22.31」
  10. 网易互娱-后台开发(支付方向)二面
  11. [渝粤教育] 哈尔滨工业大学 大学计算机—计算思维导论 参考 资料
  12. oracle remap_tablespace,oracle使用remap_tablespace修改用户数据所在的表空间
  13. Eclipse TPTP 分析程序性能
  14. Eclipse 基本 java lombok maven 示例
  15. Linux嵌入式学习(简单 platform 设备驱动的实现)
  16. 数据流图-2(分层数据流图)
  17. Word如何批量转PDF?分享一个批量转换方法
  18. CAD看图软件哪个好?好用的CAD看图软件推荐
  19. Zemax-LED准直光斑为什么是环形
  20. 在CAD图中插入一个数据Excel表格怎么办

热门文章

  1. PHP基础-自定义函数-变量范围-函数参数传递
  2. # 关于“态势感知”产品活动体验
  3. 数据科学家需要了解的5大聚类算法
  4. java 调 pro*c
  5. jUnit Test遇到org.apache.ibatis.binding.BindingException
  6. CBV 验证装饰器的使用
  7. 成本、质量、人力资源要点
  8. 03_NoSQL数据库之Redis数据库:list类型
  9. LAMP之二:LAMP的性能测试以及安装xcache,为php加速
  10. 4.12 《硬啃设计模式》 第29章 行为型设计模式小结