代理模式的特性:
代理模式是一種非常實用的變成思想。他可以幫助我們做很多事情。比如權限的攔截。方法的攔截等等。目前主要分爲兩種一種是JVM動態代理技術,和CGLIB代理技術。下面就來詳細解釋這兩種方法。
首先,JVM動態代理技術。顯然是JDK爲我們提供的一種代理技術。在JDK1.3以後的版本中實現了動態代理特性。通過JDK動態代理技術可以爲任意的JAVA對象創建代理對象。具體的實現是在Java Reflection API中實現的。其中一個重要的對象就是Proxy對象。廢話不多說,直接來看代碼。
首先創建接口類:
package cn.dao; /** * 接口類 * @author Administrator * */ public interface userdao { public void save(String name); }
接着實現這個類:
package cn.dao.imp; import cn.dao.userdao; /** * 必須實現接口 * @author Administrator * */ public class userdaoimp implements userdao { private String name=null; public userdaoimp(String name) { this.name = name; } public userdaoimp() { super(); } public String getName() { return name; } public void save(String name) { System.out.println("save"); } }
創建代理對象:
package cn.dao; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import cn.dao.imp.userdaoimp; /** * 必須實現接口InvocationHandler * @author Administrator * */ public class jdkproxyFactory implements InvocationHandler{ private Object target; /** * 創建 代理對象 * @param target * @return */ public Object createFactory(Object target){ //給代理對象賦值 this.target=target; //返回一個封裝後的代理對象 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result=null; //強制轉換成代理前對象 userdaoimp userdaoimp=(userdaoimp) this.target; //判斷權限後的操作 if (userdaoimp.getName()!=null) { result=method.invoke(target, args); } return result; } }
下面是測試類:
import org.junit.Test; import cn.dao.CGLIBPROXY; import cn.dao.jdkproxyFactory; import cn.dao.userdao; import cn.dao.imp.userdaoimp; import junit.framework.TestCase; /** * 測試類 * @author Administrator * */ public class proxyTest extends TestCase { @Test public void testproxy(){ //實例化代理類 jdkproxyFactory jFactory=new jdkproxyFactory(); //強制轉換成 ------>接口類 userdao userdao=(userdao)jFactory.createFactory(new userdaoimp()); //使用接口類調用方法 userdao.save("ss"); } }