jdk动态代理-为什么动态代理的目标方法中的 this 仍然是原对象,而不是代理对象?

在 Java 动态代理(Proxy.newProxyInstance())中,目标方法内部的 this 仍然指向原始对象(target),而不是代理对象(proxy,原因如下:


1. 动态代理的工作机制

动态代理的调用流程:

  1. 客户端调用代理对象的方法(如 proxy.doSomething())。

  2. 代理对象将方法调用转发给 InvocationHandler.invoke()

  3. InvocationHandler.invoke() 决定如何处理调用(如增强逻辑)。

  4. 最终调用目标对象的方法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

posted @ 2025-05-27 19:32  阿瞒123  阅读(32)  评论(0)    收藏  举报