深入淺出 java動態代理
阿新 • • 發佈:2019-01-03
代理類 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 反射機制可以生成任意型別的動態代理類。
哪些地方需要動態代理:
不允許直接訪問某些類;對訪問要做特殊處理等。或者,要對原方法進行統一的擴充套件,例如加入日誌記錄。