一. java 的jdk動態代理
用JDK實現的動態代理,被代理的對象必須實現一個接口才可以.其實現主是通過java.lang.reflect.Proxy類和 java.lang.reflect.InvocationHandler接口;
二. 本章用'售票點代理車站售票'的示例來演示java 的jdk動態代理的實現.完整代碼如下:
1. [被代理目標要實現的接口]
package structuralPattern.proxy.jdk;
/**
* @ClassName: ITarget
* @Description:賣票接口
* @author Liyongbin
* @date 2011-2-8 下午12:52:09
* @version V1.0
*/
public interface ITicket {
public abstract void saleTicket();
}
2. 車站售票[被代理目標]
package structuralPattern.proxy.jdk;
/**
* @ClassName: Train
* @Description:車站
* @author Liyongbin
* @date 2011-2-8 下午12:54:36
* @version V1.0
*/
public class Train implements ITicket{
@Override
public void saleTicket() {
System.out.println("售車票");
}
}
3. 售票服務
package structuralPattern.proxy.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @ClassName: BuyTicketService
* @Description:售票服務
* @author Liyongbin
* @date 2011-2-8 下午01:02:36
* @version V1.0
*/
public class BuyTicketService implements InvocationHandler {
//要代理的目標
private Object target;
public BuyTicketService(Object target) {
this.target=target;
}
//
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
deliverTicket();
method.invoke(target, args);
discountTicket();
return null;
}
//"代理"自己的方法1
public void deliverTicket() {
System.out.println("送票上門服務");
}
//"代理"自己的方法2
public void discountTicket() {
System.out.println("買票打折服務");
}
}
4. 動態代理
package structuralPattern.proxy.jdk;
import java.lang.reflect.Proxy;
/**
* @ClassName: DynamicProxy_JDK
* @Description: 動態代理
* @author Liyongbin
* @date 2011-2-8 下午12:58:45
* @version V1.0
*/
public class DynamicProxy_JDK {
public Object getProxy(Object target) {
return Proxy
.newProxyInstance(target.getClass().getClassLoader(), target
.getClass().getInterfaces(), new BuyTicketService(target));
}
}
5. 測試
package structuralPattern.proxy.jdk;
public class DynamicProxyTest {
public static void main(String[] args) {
//實例化代理
DynamicProxy_JDK dp = new DynamicProxy_JDK();
//代理
ITicket ticket = (ITicket) dp.getProxy(new Train());
//調用目標方法
ticket.saleTicket();
}
}
6. 運行結果:
送票上門服務
售車票
買票打折服務