1. 程式人生 > >深入淺出 java動態代理

深入淺出 java動態代理

代理類
public class LogHandler implements InvocationHandler {
	
	private Object targetObject;
	
	public Object newProxyInstance(Object targetObject) {
		this.targetObject = targetObject;
		return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
							   targetObject.getClass().getInterfaces(), this);
	}
	
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("start-->>" + method.getName());
		for (int i=0; i<args.length; i++) {
			System.out.println(args[i]);
		}
		Object ret = null;
		try {
			//呼叫目標方法
			ret = method.invoke(targetObject, args);
			System.out.println("success-->>" + method.getName()); 
		}catch(Exception e) {
			e.printStackTrace();
			System.out.println("error-->>" + method.getName());
			throw e;
		}
		return ret;
	}

}
介面類
public interface UserManager {

	public void addUser(String userId, String userName);
}
目標類
package com.bjpowernode.pattern;

public class UserManagerImpl implements UserManager {

	public void addUser(String userId, String userName) {
		//System.out.println("start-->>addUser() userId-->>" + userId);
		try {
			System.out.println("AddUser" );
}
	}
}
客戶端
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		LogHandler logHandler = new LogHandler();
		UserManager userManager = (UserManager)logHandler.newProxyInstance(new UserManagerImpl());
		String name = userManager.AddUser("0001",”張三”);	}

}

動態代理與靜態代理的區別:

    由程式設計師建立或由特定工具自動生成原始碼,再對其編譯。在程式執行前,代理類的.class檔案就已經存在了。動態代理類:在程式執行時,運用反射機制動態建立而成。無需程式設計師手工編寫它的原始碼。動態代理類不僅簡化了程式設計工作,而且提高了軟體系統的可擴充套件性,因為Java 反射機制可以生成任意型別的動態代理類。

哪些地方需要動態代理:

    不允許直接訪問某些類;對訪問要做特殊處理等。或者,要對原方法進行統一的擴充套件,例如加入日誌記錄。