动态代理 | Java

230 阅读4分钟

了解动态代理之前,先看下设计模式中的代理模式。

什么是代理模式?为什么要用代理模式?

代理模式指包装另一个对象,并控制对它的访问。 管理访问的方式有很多种,包括远程代理、虚拟代理和保护代理。

为什么用代理模式? 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在两者之间起到中介的作用(可类比房屋中介,房东委托中介销售房屋、签订合同等)。

代理在结构上类似装饰者,但目的不同。装饰器模式为了提供额外的行为,代理模式是为了控制访问。

(动态)代理模式主要涉及三个要素:

  1. 抽象类接口
  2. 被代理类(具体实现抽象接口的类)
  3. 动态代理类:实际调用被代理类的方法和属性的类

扩展:正向代理与反向代理

Java中的代理

所谓代理,就是代表某个真实的对象

Java中代理可以分为动态代理和静态代理两种类型。

代理类型 解释 代理类实现方式 缺点
静态代理 代理对象的类型是提前确定的 自动or手工编写代码 每个业务类都要对应一个代理类,非常不灵活,类爆炸
动态代理 代理对象的类型是动态生成的 运行时,通过 Proxy.newInstance() 自动生成 生成代理代理对象和调用代理方法都要额外花费时间

静态代理和动态代理的区别是在于要不要开发者自己定义代理类(Proxy)。

Java的动态代理是基于反射机制的。

讲下反射机制?

docs.oracle.com/javase/tuto… todo

反射最大的作用之一就在于我们可以不在编译时知道某个对象的类型,而在运行时通过提供完整的”包名+类名.class”得到。注意:不是在编译时,而是在运行时

利用Java反射机制我们可以加载一个运行时才得知名称的class,获悉其构造方法,并生成其对象实体,能对其fields设值并唤起其methods。

应用场景

反射技术常用在各类通用框架开发中。因为为了保证框架的通用性,需要根据配置文件加载不同的对象或类,并调用不同的方法,这个时候就会用到反射——运行时动态加载需要加载的对象。

特点

由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。另外,反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。

获取反射的方式

java 获取反射常使用的三种方式:

  1. 通过new对象实现反射机制
  2. 通过路径实现反射机制
  3. 通过类名实现反射机制

动态代理

是什么

动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,

应用场景

很多场景都是利用类似机制做到的,比如用来包装 RPC 调用、面向切面的编程(AOP)。

实现动态代理的方式

实现动态代理的方式很多,比如 JDK 自身提供的动态代理,主要利用了反射机制。 举例,常可采用的JDK提供的动态代理接口InvocationHandler来实现动态代理类。其中invoke方法是该接口定义必须实现的,它完成对真实方法的调用。

通过InvocationHandler接口,所有方法都由该Handler来进行处理,即所有被代理的方法都由InvocationHandler接管实际的处理任务。InvocationHandler的工作是响应代理的任何调用,可被看作代理收到方法调用后,请求做实际工作的对象。

此外,我们常可以在invoke方法实现中增加自定义的逻辑实现,实现对被代理类的业务逻辑无侵入。

参考

  1. 轻松学,Java 中的代理模式及动态代理
  2. 动态代理是基于什么原理?