java中的動(dòng)態(tài)代理Proxy

  1. 創(chuàng)建一個(gè) UserService 接口
public interface UserService {
    UserService login();
}
  1. 寫一個(gè) UserService 接口的具體實(shí)現(xiàn)類 UserServiceImpl
public class UserServiceImpl implements UserService {
    @Override
    public UserService login() {
        System.out.println("登錄成功");
        return this;
    }
}
  1. 寫一個(gè)代理類 UserProxy ,這里 實(shí)現(xiàn)了 InvocationHandler 接口
    創(chuàng)始一個(gè)使用jdk的proxy完成動(dòng)態(tài)代理工具類
public class UserProxy implements InvocationHandler {
    private Object object;

    public UserProxy() {
    }

    public JdkProxy(Object object) {
        this.object = object;
    }
   //創(chuàng)建代理對(duì)象
    public Object createProxy() {
        // 使用Proxy完成代理對(duì)象創(chuàng)建
        // 1.得到目標(biāo)對(duì)象的ClassLoader
        ClassLoader loader = target.getClass().getClassLoader();
        // 2.得到目標(biāo)對(duì)象的實(shí)現(xiàn)接口的Class[]
        Class[] interfaces = target.getClass().getInterfaces();
        // 3.第三個(gè)參數(shù)需要一個(gè)實(shí)現(xiàn)了InvocationHandler接口的對(duì)象
        return Proxy.newProxyInstance(loader, interfaces, this);
    }

    // 在代理實(shí)例上處理方法調(diào)用并返回結(jié)果。
    // 參數(shù)1 就是代理對(duì)象,一般不使用
    // 參數(shù)2它調(diào)用的方法的Method對(duì)象
    // 參數(shù)3調(diào)用的方法的參數(shù)
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 功能增強(qiáng)操作
        System.out.println("登錄前的其他操作....");
        method.invoke(object, args);
        //返回一個(gè)代理對(duì)象
        return proxy;
    }
}
  1. 編寫一個(gè)測(cè)試類 TestUserProxy
public class TestProxy {
    @Test
    public void test1() {
        // 1.創(chuàng)建目標(biāo)對(duì)象
        UserService userService = new UserServiceImpl();
        // 2.通過(guò)UserProxy完成代理對(duì)象創(chuàng)建
        UserProxy userProxy = new UserProxy(userService);
        UserService proxy = (UserService) userProxy.createProxy();
        proxy.login().login();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、基本概念 1.什么是代理? 在闡述JDK動(dòng)態(tài)代理之前,我們很有必要先來(lái)弄明白代理的概念。代理這個(gè)詞本身并不是計(jì)...
    小李彈花閱讀 16,570評(píng)論 2 40
  • 1、靜態(tài)代理與動(dòng)態(tài)代理區(qū)別 java class文件加載 一個(gè)正常的java工程,是在編輯器里編輯代碼,通過(guò)編譯生...
    安迪豬閱讀 425評(píng)論 0 1
  • 0.前言 本文主要想闡述的問(wèn)題如下:什么動(dòng)態(tài)代理(AOP)以及如何用JDK的Proxy和InvocationHan...
    SYFHEHE閱讀 2,404評(píng)論 1 7
  • 今日打卡2:共計(jì)39分鐘 在論證中,我們要關(guān)注的是論證本身,而不是作出論證的人。 對(duì)人不對(duì)事。 民主謬誤。 壓制理...
    吟_f3da閱讀 190評(píng)論 0 0
  • 用心做有情的事,只要真心付出,必會(huì)收獲信任。
    優(yōu)祺和平閱讀 213評(píng)論 0 0

友情鏈接更多精彩內(nèi)容