温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Proxy 代理和反射关系

发布时间:2026-10-09 15:58:18 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

在 Java 中,**Proxy(代理)和反射(Reflection)**关系密切,可以说:Java 的动态代理本质上是建立在反射机制之上的。下面从概念、关系、原理和示例几个层面说明。


一、什么是反射(Reflection)

反射是指:在运行时获取类的信息,并可以动态调用方法、访问属性、创建对象。

核心类:

  • Class
  • Method
  • Field
  • Constructor

示例:

Class<?> clazz = Class.forName("com.example.User");
Object obj = clazz.getDeclaredConstructor().newInstance();
Method method = clazz.getMethod("say");
method.invoke(obj);

二、什么是 Proxy(代理)

Java 中的 Proxy 通常指 动态代理(Dynamic Proxy),用于在运行时动态生成代理类,对目标对象进行增强。

主要接口:

  • java.lang.reflect.Proxy
  • java.lang.reflect.InvocationHandler

三、Proxy 和反射的关系(重点)

1️⃣ 动态代理依赖反射

  • 动态代理不是编译期生成代码
  • 而是在运行时:
    • 通过反射获取接口信息
    • 生成代理类
    • 在方法调用时通过反射调用目标方法

2️⃣ InvocationHandler 中使用反射

public 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 动态代理是反射的高级应用,反射是动态代理的实现基础。

如果你愿意,我也可以讲:

  • JDK 动态代理 vs CGLIB
  • 反射性能问题
  • Spring AOP 和 Proxy 的关系
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手