代理模式就是為了提供額外或不同的操作,而插入的用來替代實際對象的對象,這些操作涉及到與實際對象的通信,因此代理通常充當中間人角色
一、java動態代理
java動態代理可以動態地創建代理並動態地處理對所代理方法的調用。在動態代理上所做的所有調用都會被重定向到單一的調用處理器上。
1、使用動態代理的五大步驟
(1)編寫接口類和實現類
public interface UserDao {
void addUser(String var1);
}
public class UserDaoImpl implements UserDao{
@Override
public void addUser(String userName) {
System.out.println("添加用戶"+userName);
}
}
(2)通過實現InvocationHandler接口來自定義自己的InvocationHandler(主要是編寫invoke方法)
public class LogHandler implements InvocationHandler {
private Object target;
public LogHandler(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("開始記錄日志");
method.invoke(target,args);
System.out.println("結束記錄日志");
return null;
}
}
(3)使用Proxy.newProxyInstance方法創建代理對象並執行方法
UserDao userDao = new UserDaoImpl();
//構造函數中傳入實際對象
LogHandler logHandler = new LogHandler(userDao);
UserDao userDAOProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
userDao.getClass().getInterfaces(),logHandler);
userDAOProxy.addUser("aaa");
2、java動態代理的原理解析
java動態代理的核心是Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)。用於生成代理對象。
ClassLoader loader:用來指明生成代理對象使用哪個類裝載器。
Class<?>[] interfaces:用來指明生成哪個對象的代理對象(代理類和目標類需要實現相同的接口)
InvocationHandler h:最后會調用到我們自定義的方法中。
3、newProxyInstance方法生成代理對象過程
(1)通過Proxy.getProxyClass(ProxyGenerator.generateProxyClass(proxyName, interfaces))獲得動態代理類的class字節碼內容。
(2)把字節碼通過傳入的類加載器加載到虛擬機中,然后通過反射機制獲得代理類的構造方法(方法簽名為getConstructor(InvocationHandler.class)),生成代理類對象