Java反射机制深入理解与应用示例
"这篇文档是关于Java反射机制的读书笔记,主要内容涉及如何通过反射操作类、字段、方法和构造器,以及对数组的反射操作。" 在Java编程中,反射是一种强大的工具,允许我们在运行时分析和操作类的能力,这种程序被称为反射(Reflective)。每个数据类型在Java中都有一个对应的字节码表示,即类型类`Class`的一个实例。通过`Class`对象,我们可以获取关于类的各种信息,并进行动态操作。 1. 获取`Class`对象: - `Class.forName(String className)`: 通过类名字符串获取`Class`对象。 - `object.getClass()`: 对象的`getClass()`方法返回其对应的`Class`对象。 - `Class<?> clazz = SomeClass.class`: 直接使用类名后缀`.class`获取`Class`对象。 - `Class<?> superclass = clazz.getSuperclass()`: 获取类的父类`Class`对象。 2. 访问字段(Field): - `Field field = clazz.getField("fieldName")`: 获取指定名称的公共字段。 - `Field[] fields = clazz.getFields()`: 获取所有公共字段。 - `Field declaredField = clazz.getDeclaredField("fieldName")`: 获取任何可见性的字段,包括私有字段。 - `declaredField.set(object, value)` 和 `Object fieldValue = declaredField.get(object)`: 分别用于设置和获取字段值。 3. 操作方法(Method): - `Method method = clazz.getMethod("methodName", Class<?>... parameterTypes)`: 获取指定名称和参数类型的公共方法。 - `Method[] methods = clazz.getMethods()`: 获取所有公共方法。 - `Method declaredMethod = clazz.getDeclaredMethod("methodName", Class<?>... parameterTypes)`: 获取任何可见性的方法,包括私有方法。 - `Object result = method.invoke(object, args...)`: 调用方法并传入参数。 4. 构造器(Constructor): - `Constructor<?> constructor = clazz.getConstructor(Class<?>... parameterTypes)`: 获取指定参数类型的公共构造器。 - `Constructor<?>[] constructors = clazz.getConstructors()`: 获取所有公共构造器。 - `Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(Class<?>... parameterTypes)`: 获取任何可见性的构造器。 - `Object instance = constructor.newInstance(args...)`: 通过构造器创建对象实例。 5. 操作数组: - `Object array = Array.newInstance(Class<?> componentType, int[] dimensions)`: 创建多维数组。 - `Array.set(array, index, value)`: 设置数组元素值。 - `Object element = Array.get(array, index)`: 获取数组元素。 通过反射,开发者可以在运行时动态地发现和修改类的行为,这在许多场景下都非常有用,比如插件系统、序列化、单元测试等。然而,由于反射打破了封装性,使用不当可能会引入安全风险和性能问题,因此需谨慎使用。
能够分析类能力的程序被称为反射(reflective)
每一个数据类型都有对应的字节码(类型类Class的一份实例);
类里面有哪些元素呢?
字段(属性):Field
方法: Method
构造函数: Constructor
数组也是类,所以也提供对数组的操作Array(提供了动态创建数组)
Array应用的一个例子
public class ArrayTest {
public static void main(String[] args) throws Exception {
// 创建一个含有10*15*18个元素的整型数组
int dims[] = { 10, 15, 18 };
Object arr = Array.newInstance(int.class, dims);
// 给arr[5][8][10]赋值
Object arr5 = Array.get(arr, 5);
Object arr58 = Array.get(arr5, 8);
Array.set(arr58, 10, 30);
// 取出arr[5][8][10]值并输出
Object elem = Array.get(arr58, 10);
System.out.println(elem);
}
}
获取类型字节码的方法:
Class obj = Class.forName(类名称字符串);
Class obj = 对象名.getClass(); 还有一个得到父类字节码 对象名.getSuperClass()
Class obj = 类名.class; 或基本数据类型.class
下载后可阅读完整内容,剩余3页未读,立即下载
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦