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号
浙公网安备 33010602011771号