欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于jdk動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理實(shí)現(xiàn)及區(qū)別說(shuō)明

 更新時(shí)間:2023年05月06日 08:38:29   作者:yujiubo2008  
這篇文章主要介紹了基于jdk動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理實(shí)現(xiàn)及區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

jdk動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理實(shí)現(xiàn)及區(qū)別

代理模式是一種設(shè)計(jì)模式,提供了對(duì)目標(biāo)對(duì)象額外的訪問(wèn)方式,即通過(guò)代理對(duì)象訪問(wèn)目標(biāo)對(duì)象,這樣可以在不修改原目標(biāo)對(duì)象的前提下,提供額外的功能操作,擴(kuò)展目標(biāo)對(duì)象的功能。

代理模式又分為:

  • 靜態(tài)代理
  • jdk動(dòng)態(tài)代理
  • cglib動(dòng)態(tài)代理
  • 由于靜態(tài)代理會(huì)產(chǎn)生過(guò)多的代理類,一旦接口增加方法,目標(biāo)對(duì)象與代理對(duì)象都要進(jìn)行修改,不易維護(hù)。
  • 而動(dòng)態(tài)代理是動(dòng)態(tài)地在內(nèi)存中構(gòu)建代理對(duì)象,從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象的代理功能,接口增加方法時(shí)代理對(duì)象不受影響 。

下面我們講講jdk動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理實(shí)現(xiàn)及區(qū)別

jdk動(dòng)態(tài)代理實(shí)現(xiàn)

@Test
public void test(){
? ? IPerson target = new ManPerson();
? ? IPerson proxy = (IPerson)Proxy.newProxyInstance(
? ? ? ? target.getClass().getClassLoader(),?
? ? ? ? target.getClass().getInterfaces(),?
? ? ? ? new PersonInvocationHandler(target));
? ? proxy.eat();
? ? proxy.sleep();
}
// 代理對(duì)象
class PersonInvocationHandler implements InvocationHandler{
? ? private Object target;
? ? public PersonInvocationHandler(Object target){
? ? ? ? this.target = target;
? ? }
? ? @Override
? ? public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
? ? ? ? System.out.println("start");
?? ?Object result = method.invoke(target, args);
?? ?System.out.println("end");
?? ?return result;
? ? }
}
// 目標(biāo)對(duì)象
class ManPerson implements IPerson{
? ? @Override
? ? public void eat(){
?? ?System.out.println("吃飯中......");
? ? }
? ? @Override
? ? public void sleep(){
?? ?System.out.println("睡覺(jué)中......");
? ? }
}
// 目標(biāo)對(duì)象接口
interface IPerson{
? ? void eat();
? ? void sleep();
}

cglib動(dòng)態(tài)代理

@Test
public void test(){
? ? Person proxy = (Person)Enhancer.create(Person.class, new PersonMethodInterceptor());
? ? proxy.eat();
? ? proxy.sleep();
}
// 代理對(duì)象
class PersonMethodInterceptor implements MethodInterceptor{
? ? @Override
? ? public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable{
? ? ? ? System.out.println("start");
?? ?Object result = methodProxy.invokeSuper(o, objects);
?? ?System.out.println("end");
?? ?return result;
? ? }
}

目標(biāo)對(duì)象

public class Person{
? ? public void eat(){
?? ?System.out.println("吃飯中......");
? ? }
? ? public void sleep(){
?? ?System.out.println("睡覺(jué)中......");
? ? }
}

區(qū)別

1.JDK動(dòng)態(tài)代理是實(shí)現(xiàn)了被代理對(duì)象的接口,Cglib是繼承了被代理對(duì)象。

2.JDK和Cglib都是在運(yùn)行期生成字節(jié)碼,JDK是直接寫Class字節(jié)碼,Cglib使用ASM框架寫Class字節(jié)碼,Cglib代理實(shí)現(xiàn)更復(fù)雜,生成代理類比JDK效率低。

3.JDK調(diào)用代理方法,是通過(guò)反射機(jī)制調(diào)用,Cglib是通過(guò)FastClass機(jī)制直接調(diào)用方法,Cglib執(zhí)行效率更高。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot 項(xiàng)目發(fā)布到 Tomcat 服務(wù)器的操作步驟

    Spring Boot 項(xiàng)目發(fā)布到 Tomcat 服務(wù)器的操作步驟

    這篇文章主要介紹了Spring Boot 項(xiàng)目發(fā)布到 Tomcat 服務(wù)器的操作步驟,需要的朋友可以參考下
    2017-04-04
  • Java解決通信過(guò)程的中文亂碼的問(wèn)題

    Java解決通信過(guò)程的中文亂碼的問(wèn)題

    這篇文章主要介紹了 Java解決通信過(guò)程的中文亂碼的問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Java中Runnable和Callable分別什么時(shí)候使用

    Java中Runnable和Callable分別什么時(shí)候使用

    提到 Java 就不得不說(shuō)多線程了,就算你不想說(shuō),面試官也得讓你說(shuō)呀,那說(shuō)到線程,就不得不說(shuō)Runnable和Callable這兩個(gè)家伙了,二者在什么時(shí)候使用呢,下面就來(lái)和簡(jiǎn)單講講
    2023-08-08
  • Spring Boot整合JPA使用多個(gè)數(shù)據(jù)源的方法步驟

    Spring Boot整合JPA使用多個(gè)數(shù)據(jù)源的方法步驟

    這篇文章主要給大家介紹了關(guān)于Spring Boot整合JPA使用多個(gè)數(shù)據(jù)源的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • springboot訪問(wèn)請(qǐng)求404的原因及解決辦法

    springboot訪問(wèn)請(qǐng)求404的原因及解決辦法

    在使用Spring Boot開(kāi)發(fā)應(yīng)用程序時(shí),有時(shí)可能會(huì)遇到訪問(wèn)請(qǐng)求出現(xiàn)404錯(cuò)誤的情況,即請(qǐng)求的資源未找到,這篇文章主要給大家介紹了關(guān)于springboot訪問(wèn)請(qǐng)求404的原因及解決辦法,需要的朋友可以參考下
    2023-09-09
  • 關(guān)于mybatis-plus-generator的簡(jiǎn)單使用示例詳解

    關(guān)于mybatis-plus-generator的簡(jiǎn)單使用示例詳解

    在springboot項(xiàng)目中集成mybatis-plus是很方便開(kāi)發(fā)的,最近看了一下plus的文檔,簡(jiǎn)單用一下它的代碼生成器,接下來(lái)通過(guò)實(shí)例代碼講解關(guān)于mybatis-plus-generator的簡(jiǎn)單使用,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Idea 快速生成方法返回值的操作

    Idea 快速生成方法返回值的操作

    這篇文章主要介紹了Idea 快速生成方法返回值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java獲取任意http網(wǎng)頁(yè)源代碼的方法

    Java獲取任意http網(wǎng)頁(yè)源代碼的方法

    這篇文章主要介紹了Java獲取任意http網(wǎng)頁(yè)源代碼的方法,可實(shí)現(xiàn)獲取網(wǎng)頁(yè)代碼以及去除HTML標(biāo)簽的代碼功能,涉及Java正則操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • Java 測(cè)試URL地址是否能正常連接的代碼

    Java 測(cè)試URL地址是否能正常連接的代碼

    本文給大家分享兩段代碼分別是java測(cè)試URL地址是否能正常連接和Java檢測(cè)URL是否可用或者可打開(kāi)的代碼,代碼都很簡(jiǎn)單,有需要的朋友可以參考下
    2016-08-08
  • springboot實(shí)現(xiàn)攔截器之驗(yàn)證登錄示例

    springboot實(shí)現(xiàn)攔截器之驗(yàn)證登錄示例

    本篇文章主要介紹了springboot實(shí)現(xiàn)攔截器之驗(yàn)證登錄示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02

最新評(píng)論