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

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

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

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

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

1、先定義一個接口

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

2、定義被代理類

該類實現了接口

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

3、定義代理類

實現InvocationHandler接口

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

實現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();
        //設置增強類型
        enhancer.setSuperclass(cls);
        //定義代理邏輯對象為當前對象,當前對象必須實現MethodInterceptor.intercept方法
        enhancer.setCallback(this);
        //生成并返回代理對象
        return enhancer.create();
    }
    /**
     * 代理邏輯方法
     * @param o 代理對象
     * @param method 被代理類的方法
     * @param objects 方法入參
     * @param methodProxy 方法代理
     * @return 代理邏輯返回
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("調用真實對象前");
        methodProxy.invokeSuper(o,objects);
        System.out.println("調用真實對象后");
        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é)碼來實現代理效果。

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

相關文章

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

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

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

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

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

    解決Java ClassNotFoundException異常的實踐步驟

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

    Java初學者必會的Map集合及其原理

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

    淺談Spring注入模型

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

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

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

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

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

    詳解Java中跳躍表的原理和實現

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

    利用java反射機制實現自動調用類的簡單方法

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

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

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

最新評論

保康县| 马山县| 石首市| 洛南县| 娄烦县| 互助| 淮安市| 微山县| 金堂县| 高清| 文水县| 抚宁县| 彭水| 原平市| 大化| 康马县| 绥宁县| 黎川县| 闽侯县| 庐江县| 乐亭县| 桦南县| 漳州市| 长白| 巩留县| 新兴县| 梁山县| 勃利县| 延川县| 上杭县| 连山| 永修县| 靖州| 界首市| 青河县| 铁力市| 尉犁县| 宜兴市| 陆川县| 泽州县| 龙南县|