首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

java署理(Proxy)模式浅析

2012-08-25 
java代理(Proxy)模式浅析下面的代码实现一个简单的代理类,代码来自《java与模式》,该例子的任务是为一个Vect

java代理(Proxy)模式浅析

下面的代码实现一个简单的代理类,代码来自《java与模式》,该例子的任务是为一个Vector对象提供一个代理对象,当Vector的任何方法被调用之前和调用之后,分别打印出两条信息,这表明这个代理对象有能力截获和控制这个Vector对象。

?

?

上面的代码中我们创建类VectorProxy并实现InvocationHandler接口,当然它需要实现InvocationHandler接口中的invoke方法了。

我们首先需要创建一个代理对象,并在代理对象中指定被代理对象,以及指定被代理对象的所有实现接口:

Class clazz = obj.getClass(); //obj为被代理对象

Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), new VectorProxy(obj));? //传递三个参数:被代理对象的类加载器,被代理对象所实现的接口数组以及一个InvocationHandler实现类对象,注意这个实现类对象中包含了被代理对象。

?

现在我们就用生成的代理对象来代替被代理对象,直接对代理对象进行操作。

当Client需要调用被代理对象中的方法时,这些方法是它所实现接口中的方法(getInterfaces()),此时我们是对代理对象调用这些方法,代理对象便会自动调用代理对象中相关联的InvocationHandler实现类的invoke方法,即我们实现的

public Object invoke(Object proxy, Method method, Object[] args)

我们可以在invoke方法中实现我们需要的逻辑,包括调用被代理对象对应的方法:

?

method.invoke(targetObject,args) //targetObject为被代理对象,被代理对象是作为InvocationHandler实现类的成员变量,args为传递给方法的参数,

?

还可以在调用被代理对象相关方法之前和之后执行某些操作。

当我们对代理对象执行某些操作,这些操作和对被代理对象执行的操作一样,其实我们的本意也是对被代理对象进行某些操作,在本例中,即在vector中添加,删除,获取对象等。此时会自动调用代理对象中相关联的InvocationHandler接口的实现类的invoke方法,同时将代理对象,被调用的方法以及方法的参数作为参数传递给invoke,因此我们便可以在invoke中实现我们需要的操作。

?

?

热点排行