java反射如何实现
实现 Java 反射的基本方法
Java 反射机制允许在运行时动态获取类的信息并操作类或对象的属性、方法等。以下是实现反射的核心步骤:
获取 Class 对象

- 通过类名获取:
Class.forName("全限定类名")
示例:Class<?> clazz = Class.forName("java.lang.String"); - 通过对象获取:
对象.getClass()
示例:String str = ""; Class<?> clazz = str.getClass(); - 通过类字面常量获取:
类名.class
示例:Class<?> clazz = String.class;
实例化对象
- 通过
Class.newInstance()(已废弃,Java 9+推荐使用构造器):Object obj = clazz.getDeclaredConstructor().newInstance(); - 调用带参数的构造器:
Constructor<?> constructor = clazz.getConstructor(String.class); Object obj = constructor.newInstance("test");
操作字段和方法
访问字段

- 获取字段并修改值:
Field field = clazz.getDeclaredField("fieldName"); field.setAccessible(true); // 突破私有限制 field.set(obj, "newValue");
调用方法
- 调用公共方法:
Method method = clazz.getMethod("methodName", String.class); method.invoke(obj, "arg"); - 调用私有方法:
Method privateMethod = clazz.getDeclaredMethod("privateMethod"); privateMethod.setAccessible(true); privateMethod.invoke(obj);
动态代理示例
反射常用于实现动态代理:
interface Service { void serve(); }
class RealService implements Service {
public void serve() { System.out.println("实际服务"); }
}
InvocationHandler handler = (proxy, method, args) -> {
System.out.println("代理前操作");
Object result = method.invoke(new RealService(), args);
System.out.println("代理后操作");
return result;
};
Service proxy = (Service) Proxy.newProxyInstance(
Service.class.getClassLoader(),
new Class[]{Service.class},
handler
);
proxy.serve();
注意事项
- 反射会绕过访问权限检查,可能破坏封装性。
- 反射操作比直接调用性能更低,频繁调用时应考虑缓存
Class或Method对象。 - Java 模块化系统(Java 9+)中需在模块描述文件(
module-info.java)中明确开放反射权限:opens package.to.open;






