在 Java 中,**Proxy(代理)和反射(Reflection)**关系密切,可以说:Java 的动态代理本质上是建立在反射机制之上的。下面从概念、关系、原理和示例几个层面说明。
反射是指:在运行时获取类的信息,并可以动态调用方法、访问属性、创建对象。
核心类:
ClassMethodFieldConstructor示例:
Class<?> clazz = Class.forName("com.example.User");
Object obj = clazz.getDeclaredConstructor().newInstance();
Method method = clazz.getMethod("say");
method.invoke(obj);
Java 中的 Proxy 通常指 动态代理(Dynamic Proxy),用于在运行时动态生成代理类,对目标对象进行增强。
主要接口:
java.lang.reflect.Proxyjava.lang.reflect.InvocationHandlerpublic Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// method 就是反射中的 Method
return method.invoke(target, args);
}
➡️ 没有反射,就没有动态代理
interface Service {
void hello();
}
class RealService implements Service {
public void hello() {
System.out.println("real hello");
}
}
class MyHandler implements InvocationHandler {
private Object target;
MyHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before");
Object result = method.invoke(target, args); // 反射调用
System.out.println("after");
return result;
}
}
public class Test {
public static void main(String[] args) {
Service proxy = (Service) Proxy.newProxyInstance(
Service.class.getClassLoader(),
new Class[]{Service.class},
new MyHandler(new RealService())
);
proxy.hello();
}
}
反射(Reflection)
↓
Class / Method / Field
↓
Proxy 动态生成代理类
↓
InvocationHandler.invoke()
↓
method.invoke(target) ← 反射调用
Java 动态代理是反射的高级应用,反射是动态代理的实现基础。
如果你愿意,我也可以讲:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。