`

动态代理 [用jdk实现]

阅读更多

一. 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. 運行結果:

    送票上門服務
    售車票
    買票打折服務

2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics