黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Java動態代理模式詳解

Java動態代理模式詳解

更新時間:2022-08-09 10:04:04 來源:動力節點 瀏覽1826次

什么是動態代理:

代理類在程序運行時創建代理的方式叫Java動態代理模式,也就是說代理類并不是在java代碼中定義的,而是在運行的時候動態生成的

動態代理有以下特點:

1.代理對象不需要實現接口

2.代理對象的生成使用JDK API在內存中動態構建代理對象(我們需要指定代理的接口object/target object implements Type)

3.動態代理也叫:JDK代理、接口代理

JDK中生成代理對象的API代理類的封裝:java.lang.reflect.Proxy JDK實現代理只需要使用newProxyInstance方法,但是該方法需要接收三個參數。完整的寫作是:

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )

注意這個方法是Proxy類中的靜態方法,接收的三個參數依次是:

類加載器加載器: 指定當前目標對象使用類加載器,獲取加載器的方法固定

類[] 接口:目標對象實現的接口的類型,使用泛型方法確認類型

調用處理程序 h:事件處理,當目標對象的方法被執行時,會觸發事件處理器的方法,將當前執行的目標對象的方法作為參數傳入

代碼示例:接口類IUserDao.java和接口實現類,目標對象UserDao相同,無需修改。在此基礎上添加一個代理工廠類(ProxyFactory.java),在這個地方寫代理類,然后測試類(需要使用代理的代碼)首先建立目標對象和代理對象的連接,然后替換代理對象中的同名方法

代理工廠類:ProxyFactory.java

/** * 創建動態代理對象 * 動態代理不需要實現接口,但是需要指定接口類型 */
public class ProxyFactory{
    //維護一個目標對象
    private Object target;
    public ProxyFactory(Object target){
        this.target=target;
    }
   //給目標對象生成代理對象
    public Object getProxyInstance(){
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("開始事務2");
                        //執行目標對象方法
                        Object returnValue = method.invoke(target, args);
                        System.out.println("提交事務2");
                        return returnValue;
                    }
                }
        );
    }
}

測試類:App.java

/** * 測試類 */
public class App {
    public static void main(String[] args) {
        //目標對象
        IUserDao target = new UserDao();
        //【原始的類型 class cn.itcast.b_dynamic.UserDao】
        System.out.println(target.getClass());
        //給目標對象,創建代理對象
        IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
        //class $Proxy0   內存中動態生成的代理對象
        System.out.println(proxy.getClass());
        //執行方法   【代理對象】
        proxy.save();
    }
}

總結:代理對象不需要實現接口,但目標對象必須實現接口,否則無法使用動態代理。如果大家想了解更多相關知識,可以關注一下動力節點的Java設計模式,里面有更豐富的知識等著大家去學習,希望對大家能夠有所幫助。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 日韩在线观看免费 | 色猫av| 91久久精一区二区三区大全 | 91综合网 | 色博影院| 天天射天天射天天干 | 成年看片永远免费 | 色六月婷婷| 色香婷婷 | 在线免费观看亚洲视频 | 一个人视频资源在线观看www | 成人超污免费网站在线看 | 影音先锋色小姐 | 日本在线视频一区二区三区 | 人人骚| 亚洲精品第一国产综合野 | 在线观看中文字幕码2022 | 激情99| 欧美精品成人久久网站 | 日批在线看| 国产看片网站 | 黄色一级免费 | 日韩高清欧美 | 男女午夜性爽快免费视频不卡 | 国产欧美一区二区 | 天堂网中文在线 | 成人资源在线观看 | 国产一区二区三区日韩 | 亚洲rct中文字幕在线 | 桃花岛亚洲精品tv自拍网站 | 国产手机精品视频 | 伦理在线 | 国产 日韩 欧美 高清 | 中文字幕国产日韩 | 中文字幕一区二区三区永久 | 老湿机福利影院 | 夜夜骑天天干 | 老年人黄色一级片 | 欧美午夜性春猛交 | 国产影音先锋 | 国产片一区二区三区 |