首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java署理机制

2012-12-27 
Java代理机制?从上面的代码可以看出,我们可以通过建立代理角色ProxySubject来改变真实角色中的request方法

Java代理机制

?

从上面的代码可以看出,我们可以通过建立代理角色ProxySubject来改变真实角色中的request方法功能(在原方法前后添加些功能)。这个应用非常的广泛,大家可以想想Struts2框架中拦截器在Action执行前所做的工作。但事实上Struts2框架是如何做到这一点的却是十分的复杂,我们需要往下看。
?
我们进一步想一下,当我们知道了抽象角色Subject的具体定义(request方法)的时候,我们当然可以很方便的通过包装Subject的真实角色RealSubject来定义一个能够部分改变真实角色行为的代理角色ProxySubject。但是很多情况下,我们事先并不知道需要代理的对象到底是什么类型的。或者说,只有在运行过程中才知道具体的对象。那么我们能否定义

一种具体行为的代理类,能够动态的实例化任何类型的代理对象呢?说白了,我们就是想做到下面这件事:
?
????? 定义一种具体行为的代理类型:
??????????? public class ProxySubject implements interfaceX{
????????????????? private ClassX obj;
??? public ProxySubject(ClassX obj){
?????????????????????? this.obj=obj;
????????????????? }
????????????????? public void methodX(){
?????????????????????? ....新增行为
?????????????????????? obj.methodx();//真实对象行为
?????????????????????? ....新增行为
????????????????? }
??????????? }
????? 运行时遇到不同类型的对象,都能够使用ProxySubject代理来完成新的行为:
??????????? ClassA oa=....
??????????? new ProxySubject(oa).methodX;
??????????? ClassA ob=....
??????????? new ProxySubject(oa).methodX;

?

做到这一点是很困难的,但并非不可能,Java的代理机制就能够帮助我们完成这件事。

?

Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
(1) InvocationHandler接口,是代理实例的调用处理程序实现的接口。 它只有一个方法:invoke(Object proxy, Method method, Object[] args)。我们需要在实现InvocationHandler接口的具体类中的invoke方法内,编写代理行为的具体逻辑。然后将这个InvocationHandler对象传递给Proxy类中生成一个动态的代理对象。

(2) Proxy 类,提供用于创建动态代理类和实例的静态方法。其最重要的两个静态创建方法:
??????? Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
??????? Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。

?

以上面的代码为例,编写一个动态代理类:?

 

热点排行