1. 程式人生 > >Proxy動態代理程式碼示例

Proxy動態代理程式碼示例

一.自定義建立一個類JdkProxyFactory

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 
 * TODO 通過工廠生成代理物件
 * 2018年10月10日下午6:42:00
 */
public class JdkProxyFactory {
	//成員變數
	private Object target;//被代理的物件
	//使用有引數的構造方法設定代理物件 
	public JdkProxyFactory(Object target){
		this.target = target;
	}
	public Object getProxyObject(){
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
			
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				System.out.println("開始代理"); //增強實現
				Object result = method.invoke(target, args);
				System.out.println("代理結束"); //增強實現
				return result;
			}
		});
	}
}

測試:

程式碼執行後會把增強部分加進來;

/**
 * 
 * TODO
 *
 * 2018年10月10日下午6:41:24
 */
public class CustomerServiceImpl implements ICustomerService {

	@Override
	public void save() {
		System.out.println("客戶儲存了。。。。。");
	}

	@Override
	public int find() {
		System.out.println("客戶查詢數量了。。。。。");
		return 100;
	}

}
/**
 * 
 * TODO
 *
 * 2018年10月10日下午6:46:37
 */
public class Test {

	public static void main(String[] args) {
		ICustomerService customerService = new CustomerServiceImpl();
		//customerService.save();
		//利用代理物件工廠生成一個代理物件
		JdkProxyFactory factory = new JdkProxyFactory(customerService);
		Object obj = factory.getProxyObject();
		ICustomerService service = (ICustomerService)obj;
		service.save();
		System.out.println("------------------");
		UserService userService = new UserServiceImpl();
		//userService.save();
		factory = new JdkProxyFactory(userService);
		obj = factory.getProxyObject();
		userService = (UserService)obj;
		userService.save();
	}

}