最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的動態(tài)代理實現(xiàn)代碼實例

 更新時間:2023年12月14日 08:39:36   作者:Terisadeng  
這篇文章主要介紹了Java中的動態(tài)代理實現(xiàn)代碼實例,jdk動態(tài)代理本質(zhì)上是使用被代理對象的類加載器,通過被代理類實現(xiàn)的接口在運行時動態(tài)構(gòu)造出代理類來增強原始類的功能的方法,需要的朋友可以參考下

一、JDK動態(tài)代理

jdk動態(tài)代理本質(zhì)上是使用被代理對象的類加載器,通過被代理類實現(xiàn)的接口在運行時動態(tài)構(gòu)造出代理類來增強原始類的功能的方法,需要使用Java的反射機制,通過實現(xiàn)InvocationHandler接口實現(xiàn)JDK動態(tài)代理。

1、先定義一個接口

package com.teriste.fanshe;
 
public interface HelloWorld {
    void sayHello(String name);
}

2、定義被代理類

該類實現(xiàn)了接口

package com.teriste.fanshe;
 
public class HelloWorldImpl implements HelloWorld {
    @Override
    public void sayHello(String name) {
        System.out.println("Hello "+name);
    }
}

3、定義代理類

實現(xiàn)InvocationHandler接口

package com.teriste.fanshe;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * JDK動態(tài)代理
 * 代理類必須實現(xiàn)了接口
 */
public class JdkProxyHandler implements InvocationHandler {
    //被代理的真實對象
    private Object target = null;
    /**
     * 建立代理對象和真實對象的代理關(guān)系,并返回代理對象
     * @param target 真實對象
     * @return 代理對象
     */
    public Object bind(Object target){
        this.target = target;
        //真實對象的類加載器 真實對象實現(xiàn)的接口 實現(xiàn)方法邏輯的代理類
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    /**
     * 代理方法邏輯
     * @param proxy 代理對象
     * @param method 真實對象被調(diào)用的方法
     * @param args 方法入?yún)?
     * @return 代理結(jié)果返回
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("進入代理邏輯方法");
        System.out.println("在調(diào)度真實對象前的服務(wù)");
        Object object = method.invoke(target,args);
        System.out.println("在調(diào)度真實對象后的服務(wù)");
        return object;
    }
    public static void main(String[] args) {
        JdkProxyHandler jdkProxyHandler = new JdkProxyHandler();
        //通過真實對象和代理對象綁定,返回一個代理對象,這個對象和真實對象實現(xiàn)了相同的接口
        HelloWorld helloWorld = (HelloWorld) jdkProxyHandler.bind(new HelloWorldImpl());
        //該接口調(diào)用的方法就是代理對象的invoke方法
        helloWorld.sayHello("張三");
    }
}

二、CGLIB動態(tài)代理

CGLIB動態(tài)代理是通過生成被代理類的子類來增強被代理類功能的方法,因此被代理類必須可以繼承。

1、創(chuàng)建被代理類

package com.teriste.fanshe;
import java.lang.reflect.Method;
public class ReflectServiceImpl {
    public void sayHello(String name){
        System.out.println("Hello "+name);
    }
    public static void main(String[] args) {
        ReflectServiceImpl target = null;
        try {
            target = (ReflectServiceImpl)Class.forName("com.teriste.fanshe.ReflectServiceImpl").newInstance();
            Method method = target.getClass().getMethod("sayHello",String.class);
            method.invoke(target,"張三");
        }catch (NoSuchMethodException | ClassNotFoundException e){
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

2、創(chuàng)建代理類

實現(xiàn)MethodInterceptor接口

package com.teriste.fanshe;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
 * cglib動態(tài)代理
 * 代理類必須可以繼承
 * 無法代理靜態(tài)方法,需要使用asm修改字節(jié)碼的靜態(tài)代理方式
 */
public class CglibProxy implements MethodInterceptor{
    /**
     * 生成CGLIB動態(tài)代理對象
     * @param cls 被代理類的CLASS類
     * @return 類的CGLIB代理對象
     */
    public Object getProxy(Class cls){
        //CGLIB enhancer 增強類對象
        Enhancer enhancer = new Enhancer();
        //設(shè)置增強類型
        enhancer.setSuperclass(cls);
        //定義代理邏輯對象為當(dāng)前對象,當(dāng)前對象必須實現(xiàn)MethodInterceptor.intercept方法
        enhancer.setCallback(this);
        //生成并返回代理對象
        return enhancer.create();
    }
    /**
     * 代理邏輯方法
     * @param o 代理對象
     * @param method 被代理類的方法
     * @param objects 方法入?yún)?
     * @param methodProxy 方法代理
     * @return 代理邏輯返回
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("調(diào)用真實對象前");
        methodProxy.invokeSuper(o,objects);
        System.out.println("調(diào)用真實對象后");
        return null;
    }
    public static void main(String[] args) {
        CglibProxy cglibProxy = new CglibProxy();
        ReflectServiceImpl reflectService = (ReflectServiceImpl) cglibProxy.getProxy(ReflectServiceImpl.class);
        reflectService.sayHello("張三");
    }
}

三、代理類的靜態(tài)方法

cglib雖然可以代理類的方法,但是對于類的靜態(tài)方法卻無效,針對靜態(tài)方法需要使用asm重寫類的字節(jié)碼來實現(xiàn)代理效果。

到此這篇關(guān)于Java中的動態(tài)代理實現(xiàn)代碼實例的文章就介紹到這了,更多相關(guān)Java動態(tài)代理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java.lang.UnsupportedClassVersionError異常正確解決方法

    java.lang.UnsupportedClassVersionError異常正確解決方法

    java.lang.UnsupportedClassVersionError異常通常發(fā)生在嘗試在較低版本的Java虛擬機上運行使用更高版本的Jav 編譯器編譯的類文件時,下面就來介紹一下解決方法,感興趣的可以了解一下
    2024-05-05
  • Java運行時動態(tài)生成類實現(xiàn)過程詳解

    Java運行時動態(tài)生成類實現(xiàn)過程詳解

    這篇文章主要介紹了Java運行時動態(tài)生成類實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • 解決Java ClassNotFoundException異常的實踐步驟

    解決Java ClassNotFoundException異常的實踐步驟

    本文詳解Java中ClassNotFoundException的常見原因及解決方法,涵蓋類路徑配置、命名規(guī)范、打包問題、依賴管理、ClassLoader使用等,提供排查步驟和工具示例,感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2025-08-08
  • Java初學(xué)者必會的Map集合及其原理

    Java初學(xué)者必會的Map集合及其原理

    這篇文章主要給大家介紹Map集合及其原理,該集合中的信息是key-value形式,Map集合與Collection集合又有什么不同呢,要想搞清楚以上問題,下面跟著小編一起來看看吧
    2023-06-06
  • 淺談Spring注入模型

    淺談Spring注入模型

    如果不深入到Spring的源碼,是很少有機會了解到Spring的注入模型(AutowireMode)。但是為了掃清我們學(xué)習(xí)Spring源碼的障礙,我們有必要了解下Spring的注入模型,感興趣的同學(xué)可以閱讀一下
    2023-04-04
  • 使用JMeter進行接口高并發(fā)測試的實現(xiàn)

    使用JMeter進行接口高并發(fā)測試的實現(xiàn)

    本文主要介紹了使用JMeter進行接口高并發(fā)測試的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 深入理解Java序列化與反序列化

    深入理解Java序列化與反序列化

    今天教大家深入理解Java的序列化與反序列化,文中介紹的非常詳細,有很多代碼示例,對正在學(xué)習(xí)Java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • 詳解Java中跳躍表的原理和實現(xiàn)

    詳解Java中跳躍表的原理和實現(xiàn)

    跳躍表(Skip list)是有序鏈表的擴展,簡稱跳表,它在原有的有序鏈表上增加了多級索引,通過索引來實現(xiàn)快速查找,實質(zhì)上是一種可以進行二分查找的有序鏈表。本文主要為大家介紹了跳躍表的原理和實現(xiàn),需要的可以參考一下
    2022-12-12
  • 利用java反射機制實現(xiàn)自動調(diào)用類的簡單方法

    利用java反射機制實現(xiàn)自動調(diào)用類的簡單方法

    下面小編就為大家?guī)硪黄胘ava反射機制實現(xiàn)自動調(diào)用類的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • springboot普通類中如何獲取session問題

    springboot普通類中如何獲取session問題

    這篇文章主要介紹了springboot普通類中如何獲取session問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評論

绥宁县| 雅江县| 芦溪县| 南平市| 吉安县| 读书| 贡山| 陵水| 武胜县| 河源市| 雅江县| 陈巴尔虎旗| 海林市| 河池市| 海盐县| 泽库县| 巩义市| 黄大仙区| 双流县| 临夏市| 温州市| 洛扎县| 桐乡市| 准格尔旗| 满洲里市| 和平县| 阳谷县| 新巴尔虎右旗| 精河县| 清丰县| 庆阳市| 昌图县| 会同县| 台东县| 望城县| 秭归县| 平阴县| 唐山市| 镇沅| 安新县| 洛浦县|