日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java之jdk和CGLib实现动态代理

發布時間:2023/12/4 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java之jdk和CGLib实现动态代理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1?jdk實現動態代理源碼實現

這里需要用到InvocationHandler接口

public interface Hello {public void sayHello(); } public class HelloImpl implements Hello {@Overridepublic void sayHello() {System.out.println("hello word");} }

?

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method;public class HelloInvocationHandler implements InvocationHandler{private Object object;PeopleInvocationHandler(Object object){this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("-------- start ---------");Object invoke = method.invoke(people, args);System.out.println("-------- end ---------");return invoke;} } import java.lang.reflect.Proxy;public class Test {public static void main(String[] args) {HelloImpl hello = new HelloImpl();HelloInvocationHandler invocationHandler = new HelloInvocationHandler(hello);Hello proxy = (Hello) Proxy.newProxyInstance(HelloImpl.getClass().getClassLoader(), HelloImpl.getClass().getInterfaces(), invocationHandler);proxy.sayHello();} }

?

?

?

?

2?CGLib實現動態代理源碼實現

這里需要用到MethodInterceptor接口和Enhancer

public class Hello {public Hello() {System.out.println("Hello...");}public void print() {System.out.println("hello word");} } public class CglibProxyIntercepter implements MethodInterceptor {@Overridepublic Object intercept(Object sub, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {//對目標方法進行攔截處理 System.out.println("before...");Object object = methodProxy.invokeSuper(sub, objects);System.out.println("after...");return object;} } public class Test {public static void main(String[] args) {//創建加強器,用來創建動態代理類Enhancer enhancer = new Enhancer();//為加強器指定要代理的業務類enhancer.setSuperclass(Hello.class);//設置回調enhancer.setCallback(new CglibProxyIntercepter());//創建代理對象Hello proxy= (Hello) enhancer.create();proxy.print();} }

?result

before... hello word after...

?

?

?

3 對比jdk實現動態代理CGLib實現動態代理

1)、JDK

?內部主要是通過反射來實現。

?

2)、CGLib

CGLib是依靠asm字節碼處理框架實現的高性能Code生成類庫,可以在運行時擴展Java類或者實現接口?當然可以,CGLib對用戶隱藏了asm復雜的內部實現,提供了Developer友好、面向特定功能的實現,比如方法攔截(Interpreter)、懶加載(Lazyloader & Dispatcher)等,AOP中的方法攔截,Hibernate中的延遲加載都利用了CGLib

特點:可以不通過接口實現動態代理的優點之外,還有處理速度快、效率高的優點!因為生成代碼比Java反射的速度要快很多.

?

?

?

總結

以上是生活随笔為你收集整理的Java之jdk和CGLib实现动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。