如何使用反射java
获取 Class 对象
通过 Class.forName("全限定类名") 获取类对象,例如 Class<?> clazz = Class.forName("java.lang.String")。也可以使用类字面常量(.class),如 String.class。
实例化对象
通过 clazz.newInstance() 调用无参构造器创建实例(已过时,Java 9+推荐使用 clazz.getDeclaredConstructor().newInstance())。若需调用有参构造器,需先获取 Constructor 对象:
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);
Object instance = constructor.newInstance("example");
访问字段
通过 getField(公开字段)或 getDeclaredField(所有字段)获取 Field 对象,使用 set/get 读写值:

Field field = clazz.getDeclaredField("fieldName");
field.setAccessible(true); // 突破私有限制
field.set(instance, "newValue");
Object value = field.get(instance);
调用方法
通过 getMethod(公开方法)或 getDeclaredMethod(所有方法)获取 Method 对象,使用 invoke 调用:
Method method = clazz.getDeclaredMethod("methodName", String.class);
method.setAccessible(true);
Object result = method.invoke(instance, "arg1");
处理数组
使用 Array 类动态创建或操作数组:

Object array = Array.newInstance(String.class, 3);
Array.set(array, 0, "first");
String element = (String) Array.get(array, 0);
泛型与反射
泛型信息在运行时会被擦除,可通过 ParameterizedType 等接口获取部分元数据,但实际类型需通过上下文推断。
性能考虑
反射操作比直接调用慢,频繁调用时可考虑缓存 Method/Field 对象,或使用 MethodHandle(Java 7+)优化性能。
安全限制
反射可能受 SecurityManager 限制,需处理 SecurityException。模块化系统(Java 9+)中需在模块声明中开放权限(opens)。
注意:反射破坏了封装性,应优先考虑设计模式(如工厂、代理)替代直接反射调用。






