代理与动态代理

概述 代理

生活中的代理:比如暴雪又新出了一款游戏,作为一个中国用户,没有很好的方式直接从美国拿到游戏产品,就需要等到中国的某个代理商被暴雪授权代理,才可以玩上暴雪新出的这款游戏,那么代理的作用也就显而易见了,就是为了方便的适应一些不同地区的用户而产生的中间媒介,通过代理,可以更有效的将一些产品发行出去,生活中这样代理的例子比比皆是

程序中的代理:如果一些实现了同一接口的类在实现方法的时候,有了新的需求,需要增加一些异常处理、日志、计算方法的运行时间、事务管理等操作,但是我们又不能去修改源代码,这样严重影响了程序的扩展性,这个时候,,我们就可以使用代理,代理与目标类实现同一个接口,代表着代理类与目标类具有同名的方法,调用者不需要直接调用目标对象,而是使用代理间接调用目标对象的方法,并在这个过程中加入自己的处理代码,这就是程序中的代理

代理实现图示

代理可以处理的问题

系统中存在交叉业务,一个交叉业务就是要切入到系统中的一个方面,如下所示:

用具体的程序代码描述交叉业务:

交叉业务的编程问题即为面向方面的编程(Aspect oriented program ,简称AOP),AOP的目标就是要使交叉业务模块化。可以采用将切面代码移动到原始方法的周围,这与直接在方法中编写切面代码的运行效果是一样的,如下所示:

使用代理技术正好可以解决这种问题,代理是实现AOP功能的核心和关键技术。

代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的如下四个位置加上系统功能代码: 动态代理

了解了代理之后,我们知道代理类要实现与目标类相同的接口,那么现存的已知接口与其子类那么多,我们不可能一个个的手动实现他们的代理类,这个时候,java.lang.reflect中的Proxy类为我们提供了可以动态生成代理类的方法,也就是所谓的动态代理技术

动态代理就是不需要手动,而是通过JVM自动生成一份字节码,这份字节码实现了需要被代理的类的父类接口,这样就使得创建代理类变成了一件模块化的事情 利用动态代理实现一个简单代理过程 public class Proxyextends Objectimplements Serializable

Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。

static InvocationHandler(Object proxy) 返回指定代理实例的调用处理程序。

static Class<?>(ClassLoader loader, Class<?>… interfaces) 返回代理类的 java.lang.Class 对象,并向其提供类加载器和接口数组。

static boolean(Class<?> cl) 当且仅当指定的类通过 getProxyClass 方法或 newProxyInstance 方法动态生成为代理类时,返回 true。

static Object(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。

以上是Proxy代理类的一些方法,其中,getProxyClass可以获得生成好的代理类字节码,而newProxyInstance可以直接获得一个动态代理类的对象这里我们考虑,生成一个代理类,具体需要哪些东西?

这也就是newProxyInstance的参数含义,其中对目标对象的操作封装在InvocationHandler类中

public interface InvocationHandler

InvocationHandler 是代理实例的调用处理程序 实现的接口。

Object(Object proxy, Method method, Object[] args) 在代理实例上处理方法调用并返回结果。

这个类就是封装了操作目标对象的具体实现代码,也就是说,将功能也模块化

InvocationHandler中只有一个方法,需要实现的其他功能以及对目标对象的操作,需要在这里完成

然后将这个对象作为参数传递给newProxyInstance方法,从而构造代理类下面的例子通过newProxyInstance方法实现动态代理

首先是一个公共接口

Speak {sayHello(); 3: }这几年大多是昆明空运来的,

代理与动态代理

相关文章:

你感兴趣的文章:

标签云: