在 Java 中,动态代理(Proxy)和反射(Reflection)是紧密相关的,可以说:Java 动态代理是基于反射机制实现的。下面从概念、关系和示例三个层面说明。
反射是 Java 在运行时动态获取类信息并操作类成员(构造方法、方法、字段等)的能力。
常见反射 API:
Class<?> clazz = Class.forName("com.example.User");
Method method = clazz.getMethod("say", String.class);
method.invoke(obj, "hello");
作用:
Java 中的 java.lang.reflect.Proxy 是动态代理的实现方式之一。
特点:
InvocationHandler示例:
interface Service {
void doWork();
}
class RealService implements Service {
public void doWork() {
System.out.println("real work");
}
}
Service proxy = (Service) Proxy.newProxyInstance(
Service.class.getClassLoader(),
new Class[]{Service.class},
(proxy1, method, args) -> {
System.out.println("before");
method.invoke(new RealService(), args);
System.out.println("after");
return null;
}
);
proxy.doWork();
Proxy 生成的代理类在调用方法时Method.invoke()(反射)调用目标方法也就是说:
没有反射,Java 原生动态代理无法实现
Object invoke(Object proxy, Method method, Object[] args)
Method 来自反射method.invoke(target, args) 是反射调用| 对比 | Proxy | Reflection |
|---|---|---|
| 目的 | 增强 / 拦截方法 | 动态访问类信息 |
| 使用层级 | 更高层封装 | 更底层机制 |
| 关系 | 基于反射 | 被代理使用 |
直接用反射:
用 Proxy:
Java 动态代理是“用反射实现的、面向接口的运行时方法拦截机制”
如果你愿意,我也可以讲:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。