1、 文章背景
周末忙着陪未来的岳父岳母,又断更了...,兄弟们,我要结婚了。但也不影响继续写文章的决心,路还很长,加油!
2、 反射的概述
摘要:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
什么是反射
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。反射机制主要提供了以下功能:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
3、Class类对象
在面向对象的世界里,万事万物皆对象。
在java的世界里,有两样不是对象,基本数据类型与java静态的东西,但是基本数据类型有封装类型,弥补了基本数据类型的不足。
这里解释一个问题,Java对象8种基本数据类型进行封装的原因:
- 因为封装的数据类型是一个对象,可以拥有属性和方法,有了这些属性和方法就可以用它们来处理数据, 比如Integer对象里的parseInt(String s),可以把字符串转换成int类型等。
- Java是一门面向对象的语言,到处是对象,有时候我们传递的值应该是对象类型。
- 封装类型弥补了基本数据类型的一些不足。
类是对象,类是java.lang.Class的实例对象。
4、反射相关API
-
java.lang.Class类: 是Java反射机制的核心类,它代表了Java类的属性和方法,并包含了类的相关信息,比如类的名字、父类以及接口等信息。Class类的对象由JVM自动生成,当JVM加载某个类时,它会自动产生这个类对应的Class对象,并通过类名.class来获取该对象。 -
java.lang.reflect包: 提供了进行反射操作的一系列类和方法,主要包括以下几个类:Field:表示类的成员变量(属性)。Method:表示类的方法。Constructor:表示类的构造方法。Array:提供了动态创建数组和访问数组元素的静态方法。
-
基本用法示例
- 获取Class对象
Class<?> c1 = Class.forName("com.example.MyClass"); // 注意处理ClassNotFoundException Class<?> c2 = MyClass.class; Class<?> c3 = new MyClass().getClass();- 创建实例
Class<?> c = Class.forName("com.example.MyClass"); Object obj = c.newInstance(); // 注意处理InstantiationException, IllegalAccessException- 获取并调用方法
Method method = c.getMethod("myMethod", String.class); // 获取名为myMethod,参数为String的方法 Object result = method.invoke(obj, "argument"); // 调用方法,传入实例和参数- 获取并修改字段
Field field = c.getDeclaredField("myField"); // 获取名为myField的字段 field.setAccessible(true); // 设置为可访问,忽略private修饰符 field.set(obj, "newValue"); // 设置字段的值
5、使用场景
- 框架设计:许多框架(如Spring)通过反射机制来实现依赖注入和AOP等功能。
- 工具类:例如ORM框架,通过反射将数据库表的记录映射为Java对象。
- 动态加载类和动态代理:在需要根据条件动态加载类或者创建代理对象时,反射是非常有用的。
注意事项
- 性能开销:反射相比直接代码调用有一定的性能开销,因为涉及到类型解析、安全检查等。
- 安全性:反射破坏了封装性,可能会带来潜在的安全问题。使用时需要确保对类的结构和行为有足够的了解。
- 兼容性:随着Java版本的更新,反射API可能会有所改变,需要注意兼容性问题。
Java反射机制为开发者提供了极大的灵活性,但同时也需要谨慎使用,以避免潜在的性能和安全问题。
6、反射优缺点
-
优点
- 动态性:允许在运行时动态地操作类的属性、方法和构造方法,提供更大的灵活性和可扩展性。
- 提高代码复用率:通过反射,可以实现动态代理、Spring管理bean等,提高代码的复用率。
- 框架开发基础:反射是许多框架和工具的基础,使框架具有更高的灵活性和可配置性。
- 调试和测试:反射机制可以在调试和测试阶段提供更多的信息和功能,方便进行调试和测试。
-
缺点
- 性能损耗:反射调用方法比直接调用要慢,因为涉及到动态类型的解析。
- 可读性和可维护性下降:使用反射后,代码的可读性和可维护性会下降,因为反射代码通常更难理解和维护。
- 安全问题:反射可以绕过访问控制,可能会导致安全问题。