java面試-java動態代理和cglib代理


  代理模式就是為了提供額外或不同的操作,而插入的用來替代實際對象的對象,這些操作涉及到與實際對象的通信,因此代理通常充當中間人角色

一、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)),生成代理類對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM