java 如何实现反射
反射的基本概念
反射(Reflection)是Java语言的一种特性,允许程序在运行时动态获取类的信息、调用对象的方法或访问字段。反射机制使得Java程序具备动态性,能够在运行时分析和操作类或对象。
获取Class对象
要使用反射,首先需要获取目标类的Class对象。Class对象是反射操作的入口点,有以下几种获取方式:
-
通过类的静态属性
class获取:Class<?> clazz = String.class; -
通过对象的
getClass()方法获取:String str = "example"; Class<?> clazz = str.getClass(); -
通过
Class.forName()方法根据类名获取:Class<?> clazz = Class.forName("java.lang.String");
创建对象实例
通过Class对象可以动态创建类的实例,主要有两种方式:
-
使用
newInstance()方法(要求类有无参构造器):Object obj = clazz.newInstance(); -
通过构造器对象创建实例:
Constructor<?> constructor = clazz.getConstructor(String.class); Object obj = constructor.newInstance("example");
访问字段
反射可以动态访问和修改对象的字段值:
-
获取字段对象:

Field field = clazz.getDeclaredField("fieldName"); -
设置字段可访问性(对于私有字段):
field.setAccessible(true); -
读取和设置字段值:
Object value = field.get(obj); field.set(obj, newValue);
调用方法
通过反射可以动态调用对象的方法:
-
获取方法对象:
Method method = clazz.getMethod("methodName", parameterTypes); -
调用方法:

Object result = method.invoke(obj, args);
数组操作
反射也支持对数组的操作:
-
创建数组:
Object array = Array.newInstance(String.class, 10); -
设置和获取数组元素:
Array.set(array, 0, "first"); String element = (String) Array.get(array, 0);
泛型处理
反射可以绕过泛型检查,但需要注意类型安全:
List<String> list = new ArrayList<>();
Method addMethod = list.getClass().getMethod("add", Object.class);
addMethod.invoke(list, 123); // 绕过泛型检查
性能考虑
反射操作比直接调用性能较低,因为涉及动态解析和安全性检查。在性能敏感的场景中应谨慎使用,或考虑缓存反射对象(如Method、Field等)。
安全限制
反射可能破坏封装性,访问私有成员时需要处理SecurityManager的限制。在安全管理器存在的环境中,可能需要调整安全策略。
常见应用场景
反射常用于框架开发、动态代理、注解处理、序列化/反序列化等场景。例如Spring框架的依赖注入、Hibernate的ORM映射等都大量使用了反射机制。






