代理模式主要有兩種:靜態代理和動態代理
< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
Java代碼 < xmlnamespace prefix ="v" ns ="urn:schemas-microsoft-com:vml" />
1 > 接口
package com.proxy;
/**
* 接口
*
*/
public interface ITask {
public String task(String name);
}
2 > 實理類
package com.proxy;
/**
* 實現類
*
*/
public class TaskImpl implements ITask {
public String task(String name) {
System.out.println("hello "+name);
return "hello "+name;
}
}
一. 靜態代理:
3 > 靜態代理類
package com.proxy;
/**
* 靜態理,就是實理接品中的所有方法,
* 跟據傳入的實理類,來調用實理類中的方法
*
*/
public class StaticProxy implements ITask{
private ITask task;
public StaticProxy(ITask task){
this.task = task;
}
/*
* 實現接口中的方法,但是用傳入的實理類來搞用自己的方法
*/
public String task(String name) {
return task.task(name);
}
}
4 > 調用靜態代理
package com.proxy.test;
import com.proxy.ITask;
import com.proxy.StaticProxy;
import com.proxy.TaskImpl;
/**
* 測試靜態理
* @author Administrator
*
*/
public class TestStaticProxy {
public static void main(String[] args){
ITask proxy = new StaticProxy(new TaskImpl());
proxy.task("張三");
}
}
二.動態代理:
5 > 動態代理類
package com.proxy.dy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 動態代理類只能代理接口,代理類都需要實現InvocationHandler類,實現invoke方法。
* 該invoke方法就是調用被代理接口的所有方法時需要調用的,該invoke方法返回的值是被代理接口的一個實現類
* @author Administrator
*
*/
public class DynamicProxy implements InvocationHandler {
private Object object;
/*
* 返回一個代理類
* @param ob
* @return
*/
public Object bind(Object ob){
this.object = ob;
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(), this);
}
/*
* 對這個代理類中所有方法攔截
*/
public Object invoke(Object arg0, Method arg1, Object[] arg2)
throws Throwable {
Object result = null;
log("method start........");
result = arg1.invoke(object, arg2);
log("method end .........");
return result;
}
/**
* 日志輸出方法
* @param msg
*/
public void log(String msg){
System.out.println(msg);
}
}
6 > 調用動態代理
package com.proxy.test;
import com.proxy.ITask;
import com.proxy.TaskImpl;
import com.proxy.dy.DynamicProxy;
/**
* 測試動態代理
* @author Administrator
*
*/
public class TestDynamicProxy {
/**
* @param args
*/
public static void main(String[] args) {
DynamicProxy dynamicProxy = new DynamicProxy();
ITask task = (ITask)dynamicProxy.bind(new TaskImpl());
task.task("李四");
}
}
總結:這其實是AOP的最底層實現,AOP的的好處就是用到了代理,把各種業務邏輯分離開來了,不管是核心要處理的還是作為輔助功能(或者測試)的業務邏輯,比如日志作為一個切面可以去測試每個方法是否都執行了,用AOP就不需要去改動任何核心業務,如果不要了,就不指定Pointcut就可以了(關於AOP的各種術語可以參考 spring reference),這應該算是一種思想的轉變。