Java 反射 API 简介

简介: 通常来说,使用反射 API 的第一步便是获取 Class 对象。在 Java 中常见的有这么三种。

通常来说,使用反射 API 的第一步便是获取 Class 对象。在 Java 中常见的有这么三种。

  1. 使用静态方法 Class.forName 来获取。
  2. 调用对象的 getClass() 方法。
  3. 直接用类名 +“.class”访问。对于基本类型来说,它们的包装类型(wrapper classes)拥有一个名为“TYPE”的 final 静态字段,指向该基本类型对应的 Class 对象。


例如,Integer.TYPE 指向 int.class。对于数组类型来说,可以使用类名 +“[ ].class”来访问,如 int[ ].class。


除此之外,Class 类和 java.lang.reflect 包中还提供了许多返回 Class 对象的方法。例如, 对于数组类的 Class 对象,调用 Class.getComponentType() 方法可以获得数组元素的类型。


一旦得到了 Class 对象,我们便可以正式地使用反射功能了。下面我列举了较为常用的几项。

  1. 使用 newInstance() 来生成一个该类的实例。它要求该类中拥有一个无参数的构造器。
  2. 使用 isInstance(Object) 来判断一个对象是否该类的实例,语法上等同于 instanceof 关键字(JIT 优化时会有差别,我会在本专栏的第二部分详细介绍)。
  3. 使用 Array.newInstance(Class,int) 来构造该类型的数组。
  4. 使用 getFields()/getConstructors()/getMethods() 来访问该类的成员。除了这三个之外,Class 类还提供了许多其他方法,详见 [4]。需要注意的是,方法名中带 Declared 的不会返回父类的成员,但是会返回私有成员;而不带 Declared 的则相反。


getFields

getConstructors //获取一个对象

getMethods


当获得了类成员之后,我们可以进一步做如下操作。

使用 Constructor/Field/Method.setAccessible(true) 来绕开 Java 语言的访问限制。使用 Constructor.newInstance(Object[]) 来生成该类的实例。

使用 Field.get/set(Object) 来访问字段的值。

使用 Method.invoke(Object, Object[]) 来调用方法。

https://docs.oracle.com/javase/tutorial/reflect/  


目录
相关文章
|
1天前
|
Java 程序员 API
Java并发基础:concurrent Flow API全面解析
java.util.concurrent.Flow定义了响应式编程的核心接口,促进了Java在异步数据处理和背压机制方面的标准化,这使得第三方库如Reactor和RxJava能够基于这些接口提供丰富的实现和功能,同时简化了响应式编程在Java中的使用,Flow API增强了Java在并发编程领域的灵活性,使得处理异步数据流变得更加自然和高效。
Java并发基础:concurrent Flow API全面解析
|
1天前
|
存储 Java
[Java]反射
[Java]反射
30 1
[Java]反射
|
15天前
|
算法 Java PHP
「译文」Java 垃圾收集参考手册(一):垃圾收集简介
「译文」Java 垃圾收集参考手册(一):垃圾收集简介
|
15天前
|
存储 Java 关系型数据库
Java8新特性:强大的Stream API
Java8新特性:强大的Stream API
22 0
|
18天前
|
人工智能 运维 安全
Java反射(2)
Java反射(2)
5 0
|
18天前
|
存储 前端开发 Java
Java反射(1)
Java反射(1)
34 0
|
18天前
|
存储 运维 安全
Java常用类和基础API
Java常用类和基础API
32 0
|
20天前
|
存储 安全 Java
JAVA8实战 - 日期API
JAVA8实战 - 日期API
70 0
|
20天前
|
Java API
Java 8 时间和日期 API
Java 8 时间和日期 API
27 1
|
22天前
|
Java 编译器 API
【Java】lambda表达式,Stream API,函数式编程接口
【Java】lambda表达式,Stream API,函数式编程接口
22 0

相关产品

  • 云迁移中心