首先,java中为什么要提出代理的设计模式呢?代理模式的作用是:为其它对象提供一种代理以控制对这个对象的訪问。在某些情况下,一个客户不想或者不能直接引用还有一个对象,而代理对象能够在client和目标对象之间起到中介的作用。 上面将的有点抽象,代理发生在代理类和被代理类之间,代理的主要功能就是给被代理类的方法做一些事前处理和事后处理的工作。java中代理又分为静态代理和动态代理。我们一一来看,假设知道Spring中Aop就非常easy理解这里的代理模式了,事实上Spring中Aop就是通过代理模式来实现的
一、静态代理。我们直接上代码
1、接口
public interface Test {
public void request();
}
2、被代理类
public class RealTest implements Test{ @Override
public void request() {
System.out.println("real test");
} }
3、代理类
public class StaticProxyTest implements Test{
private Test test;
public StaticProxyTest(Test test){
this.test = test;
}
@Override
public void request() {
System.out.println("预处理工作");
test.request();
System.out.println("兴许工作");
} }
4、測试
//静态代理
public static void fun1(){
StaticProxyTest proxy = new StaticProxyTest(new RealTest());
proxy.request();
}
观察代码能够发现每个代理类仅仅能为一个接口服务,这样一来程序开发中必定会产生过多的代理,并且。所有的代理操作除了调用的方法不一样之外。其它的操作都一样,则此时肯定是反复代码。
解决这一问题最好的做法是能够通过一个代理类完毕所有的代理功能,那么此时就必须使用动态代理完毕。
再来看一下动态代理:
二、动态代理
接口和被代理类不变
代理类:(整个类中是没有特定的对象的。所以称为动态代理。具有通用行)
public class DynamicProxyTest implements InvocationHandler{
private Object test;//能够用Test取代Object
public DynamicProxyTest(Test test){
this.test = test;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("预处理工作");
method.invoke(test, args);
System.out.println("兴许工作");
return null;
} }
測试:
//动态代理
/**
* 通过这样的方式,被代理的对象(RealTest)能够在执行时动态改变。
* 须要控制的接口(Test接口)能够在执行时改变,
* 控制的方式(DynamicProxyTest类)也能够动态改变,从而实现了很灵活的动态代理关系
*/
public static void fun2(){
RealTest test = new RealTest();
Class t = test.getClass();
InvocationHandler handler = new DynamicProxyTest(test);
//相当于生成了一个实现的Test接口的一个类
Test te = (Test)Proxy.newProxyInstance(t.getClassLoader(), t.getInterfaces(), handler);
te.request();
}
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到下面两个类:
(1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args)。在实际使用时,第一个參数obj通常是指代理类。method是被代理的方法,如上例中的request()。args为该方法的參数数组。
这个抽象方法在代理类中动态实现。
(2).Proxy:该类即为动态代理类。作用类似于上例中的ProxySubject,当中主要包括下面内容:
Protected Proxy(InvocationHandler h):构造函数,预计用于给内部的h赋值。
Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类。当中loader是类装载器,interfaces是真实类所拥有的所有接口的数组。
Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类能够当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。
所谓Dynamic Proxy是这样一种class:它是在执行时生成的class。在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然能够把该class的实例当作这些interface中的不论什么一个来用。当然啦。这个Dynamic Proxy事实上就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作
參考文章:
http://www.cnblogs.com/xiaoluo501395377/p/3383130.html
http://www.cnblogs.com/rollenholt/archive/2012/11/28/2792779.html
http://www.iteye.com/problems/15304