本文整理自:Java 核心技术面试精讲:第6讲 | 动态代理是基于什么原理?

定义

动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制。
**
很多场景都是利用类似机制做到的,比如用来包装 RPC 调用、面向切面的编程(AOP)

实现动态代理的方式很多,比如 JDK 自身提供的动态代理,就是主要利用了提 反射机制。还有其他的实现方式,比如利用传说中更高性能的 字节码操作机制,类似 ASM、cglib(基于 ASM)、Javassist 等。

代理机制

动态代理是一个代理机制,详情参见
语雀内容

示例

  1. public class MyDynamicProxy {
  2. public static void main (String[] args) {
  3. HelloImpl hello = new HelloImpl();
  4. MyInvocationHandler handler = new MyInvocationHandler(hello);
  5. // 构造代码实例
  6. Hello proxyHello = (Hello) Proxy.newProxyInstance(HelloImpl.class.getClassLoader(), HelloImpl.class.getInterfaces(), handler);
  7. // 调用代理方法
  8. proxyHello.sayHello();
  9. }
  10. }
  11. interface Hello {
  12. void sayHello();
  13. }
  14. class HelloImpl implements Hello {
  15. @Override
  16. public void sayHello() {
  17. System.out.println("Hello World");
  18. }
  19. }
  20. class MyInvocationHandler implements InvocationHandler {
  21. private Object target;
  22. public MyInvocationHandler(Object target) {
  23. this.target = target;
  24. }
  25. @Override
  26. public Object invoke(Object proxy, Method method, Object[] args)
  27. throws Throwable {
  28. System.out.println("Invoking sayHello");
  29. Object result = method.invoke(target, args);
  30. return result;
  31. }

上面的 JDK Proxy 例子,非常简单地实现了动态代理的构建和代理操作。首先,实现对应的 InvocationHandler;然后,以接口 Hello 为纽带,为被调用目标构建代理对象,进而应用程序就可以使用代理对象间接运行调用目标的逻辑,代理为应用插入额外逻辑(这里是 println)提供了便利的入口。

Retrofit 的 核心使用的便是 java 提供的动态代理:
语雀内容