jdk动态代理-为什么动态代理的目标方法中的 this 仍然是原对象,而不是代理对象?
在 Java 动态代理(Proxy.newProxyInstance())中,目标方法内部的 this 仍然指向原始对象(target),而不是代理对象(proxy),原因如下:
1. 动态代理的工作机制
动态代理的调用流程:
-
客户端调用代理对象的方法(如
proxy.doSomething())。 -
代理对象将方法调用转发给
InvocationHandler.invoke()。 -
InvocationHandler.invoke()决定如何处理调用(如增强逻辑)。 -
最终调用目标对象的方法(
method.invoke(target, args))。
关键点:
-
代理对象(
proxy)只是一个“壳”,它不包含真正的业务逻辑,只是把方法调用委托给InvocationHandler。 -
目标方法(
target.method())执行时,this自然指向target,因为方法是在target上运行的,而不是proxy。
2. 示例代码分析
public interface UserService {
void doSomething();
}
public class UserServiceImpl implements UserService {
@Override
public void doSomething() {
System.out.println("this = " + this); // 这里 this 是 UserServiceImpl,不是代理对象
}
}
public class ProxyTest {
public static void main(String[] args) {
UserService target = new UserServiceImpl();
UserService proxy = (UserService) Proxy.newProxyInstance(
ProxyTest.class.getClassLoader(),
new Class[]{UserService.class},
(p, method, args1) -> {
System.out.println("代理增强逻辑");
return method.invoke(target, args1); // 调用目标对象的方法
}
);
proxy.doSomething(); // 调用代理方法
}
}
输出
代理增强逻辑
this = UserServiceImpl@123456
-
proxy.doSomething()会触发InvocationHandler.invoke()。 -
method.invoke(target, args)调用的是target的方法,所以this指向UserServiceImpl实例。
3. 为什么 this 不是代理对象?
-
this是 Java 语言层面的概念,它指向当前执行方法的对象实例。 -
动态代理是基于接口的,代理对象并不继承目标类,而是实现相同的接口,所以:
-
代理对象(
proxy)和原始对象(target)是两个不同的对象。 -
当
method.invoke(target, args)执行时,方法运行在target上,this自然指向target。
-

浙公网安备 33010602011771号