锁定老帖子 主题:【解惑】 Java代理机制
精华帖 (0) :: 良好帖 (4) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-14
最后修改:2010-08-05
代理(Proxy)实际上是一种设计模式。代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到的角色有:
//抽象角色: public interface Subject{ void request(); } //真实角色:实现了Subject的request()方法。 public class RealSubject implements Subject{ public void request() { System.out.println("我是真是角色"); } } //代理角色: public class ProxySubject implements Subject{ //以真实角色作为代理角色的属性 private RealSubject realSubject; public ProxySubject(RealSubject real){ this.realSubject=real; } //该方法改变了真是对象的request行为 public void request(){ System.out.println("之前设置新行为" ); realSubject.request(); //此处执行真实对象的request方法 System.out.println("之后设置新行为" ); } } //main测试 Subject sub=new ProxySubject(); Sub.request();
从上面的代码可以看出,我们可以通过建立代理角色ProxySubject来改变真实角色中的request方法功能(在原方法前后添加些功能)。这个应用非常的广泛,大家可以想想Struts2框架中拦截器在Action执行前所做的工作。但事实上Struts2框架是如何做到这一点的却是十分的复杂,我们需要往下看。 一种具体行为的代理类,能够动态的实例化任何类型的代理对象呢?说白了,我们就是想做到下面这件事:
做到这一点是很困难的,但并非不可能,Java的代理机制就能够帮助我们完成这件事。
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类: (2) Proxy 类,提供用于创建动态代理类和实例的静态方法。其最重要的两个静态创建方法:
以上面的代码为例,编写一个动态代理类: //完成代理行为 import java.lang.reflect.Method; import java.lang.reflect.InvocationHandler; public class DynamicSubject implements InvocationHandler { private Object sub; //被代理类 public DynamicSubject(Object obj) { sub = obj; } //无论何时调用代理类的方法,都会执行这个invoke方法的。 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("调用被代理对象的方法是:"+method.getName()+" "+method.getDeclaringClass()); System.out.println("之前设置新行为" ); method.invoke(sub,args); //动态调用被代理类的行为方法。 System.out.println("之后设置新行为" ); return null; } } //测试 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.io.*; static public void main(String[] args) throws Throwable{ Object real=new RealSubject(); //被代理对象 InvocationHandler handler = new DynamicSubject(real); //生成一个具体的代理行为 Object proxyed = Proxy.newProxyInstance(real.getClass().getClassLoader(), real.getClass().getInterfaces(),handler); //动态生成实现Subject接口的代理类 对象 if(proxyed instanceof Subject){ Subject subProx=(Subject)proxyed; subProx.request(); } else proxyed.toString(); } /* 调用被代理对象的方法是:request interface hr.login.Subject 之前设置新行为 我是真是角色 之后设置新行为 */
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-09-10
所以考虑性能问题,在ArrayList初始化的时候就应该指定合适大小减少数据转移次数
|
|
返回顶楼 | |
发表时间:2009-09-10
C的时候不就是这样干的么
|
|
返回顶楼 | |
发表时间:2009-09-11
使用ArrayList在于随机获取数据比较快,我到觉得一般的java应用都可以使用linkedList应该比较高效。
|
|
返回顶楼 | |
浏览 4175 次