GuoXin Li's Blog

Java Reflect

字数统计: 741阅读时长: 2 min
2022/04/22 Share

反射|注解|泛型

反射

反射:解决运行期间对某个未知实例,进行调用其方法。反射是一种专门为静态语言(编译时变量的数据类型即可确定的语言,要求使用变量之前必须声明数据类型。如c++、Java、C#等)提供的技术,用于在程序运行时动态的改变程序的状态和行为。运行时,对于任意一个类或对象,都能够调用它的任意字段和方法。

Java 类的成员包括:属性字段、构造函数、方法。

反射API与Java的以上成员相关:

img

获取 Class 对象的三种方式:

1
2
3
4
5
6
7
// 1.通过字符串获取Class对象,这个字符串必须带上完整路径名
Class s1 = Class.forName("com.test.reflection.Student");
// 2.通过类的class属性
Class s2 = Student.class;
// 3.通过对象的getClass()函数
Student object3 = new Student();
Class s3 = object3.getClass();

获取成员变量:

  • getDeclaredFields:用于获取所有声明的字段,包括公有和私有字段(属性)。
  • getFields:仅用来获取公有字段。

获取构造方法:

  • getDeclaredConstructors:获取所有构造方法。
  • getConstructors :获取公有构造方法。

获取非构造方法:

  • getDeclaredMethods:获取所有声明的非构造函数。
  • getMethods:获取仅公有非构造函数。

需要注意的是,需要调用 Field/Constructor/Methods.setAccessible(true) 才可使得私有的字段/构造方法/方法得以使用。

注解 Annotation

Java 注解为jdk5.0之后引入的一种注释机制。

Java中的类、方法、变量、参数和包等都可以被标注。Java 标注可以通过反射获取标注的内容。在编译器生成类文件时,标注可以被嵌入到字节码中。

内置注解

Java7之前 一共定义了3个 java.lang中,剩下的4个在java.annotation中。

作用于代码之上:

  • Override: 检查该方法是否被重写,若发现父类或者引用的接口中没有该方法,则编译报错。
  • Deprecated:标记过时的方法,编译警告。
  • SuppressWarnings:提示编译器忽略注解中声明的警告。

作用于其他注解的注解(元注解):

  • Retention:标注注解怎么保存,只在代码中,还是编入class,还是运行时可通过反射访问。
  • Documented:标注注解是否用在用户文档中。
  • Target:标记这个注解应该是哪种 Java 成员。
  • Inherited:标记此注解用于哪个注解类

Java7 之后的注解:

  • SafaVarargs:Java7 支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
  • FunctionalInterface:Java8支持,表示一个匿名函数或函数式接口。
  • Repeatable:Java8支持,标识某注解可以在同一声明上使用多次。

Annotation架构

Screen Shot 2022-04-23 at 21.18.51

Java Annotation组成中3个主干类:Annotation.java, ElementType.java, retentionPolicy.java.

  • Annotation为接口
  • ElementType 为枚举类,用来制定 Annotation 类型。
  • RetentionPolicy 为枚举类型,用来指定 Annotation 策略。
CATALOG
  1. 1. 反射|注解|泛型
    1. 1.1. 反射
    2. 1.2. 注解 Annotation
    3. 1.3. Annotation架构