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

歡迎訪問 生活随笔!

生活随笔

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

python

看完Java的动态代理技术——Pythoner笑了

發布時間:2023/12/19 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 看完Java的动态代理技术——Pythoner笑了 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java的動態代理常用來包裝原始方法調用,用于增強或改寫現有方法的邏輯,它在Java技術領域被廣為使用,在阿里的Sofa RPC框架序列化中你能看到它的身影,Hibernate的實體類功能增強也是以動態代理的方式解決的,還有Spring吹牛逼的AOP功能也是它搞定的。接下來我們看一個例子,該例子用于對原有的方法調用前后各打印一句話,這也算是對原有類方法的一種增強。

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;interface IHello {void say(String s);}// 待加強的目標類 class RealHello implements IHello {@Overridepublic void say(String s) {System.out.println("hello " + s);}}// 增強器 class HelloDelegate implements InvocationHandler {private IHello target; // 原始對象public HelloProxy(IHello target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("before print");method.invoke(target, args); // 調用原始對象的方法System.out.println("after print");return null;}}public class DynamicProxy {public static void main(String[] args) {IHello hello = enhanceHello(new RealHello()); # 增強原始方法hello.say("world");}public static IHello enhanceHello(IHello target) {return (IHello) Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(), new Class<?>[] { IHello.class },new HelloDelegate(target));}} 復制代碼

輸出

before print hello world after print 復制代碼

為了便于理解,我們用圖來表示上面的對象的關系。我們調用Proxy.newProxyInstance產生了一個匿名類實例,該實例同樣實現了IHello接口,它的作用就是用來替代原生的RealHello實例。這個匿名實例持有HelloDelegate實例的引用,當你對這個匿名實例進行方法調用時,它會將調用邏輯委托給HelloDelegate實例的invoke方法。HelloDelegate實例內部又持有原生RealHello對象的引用,所以用戶就可以在invoke方法里實現任意附加邏輯,以及對原生RealHello對象的調用。

上面是jdk自帶的動態代理技術,它的缺點是必須定義接口才能實現目標對象的方法增強,甚至想使用abstract class來替代也不行。所以開源市場上冒出了好幾個動態代理的庫,用于替代原生的jdk動態代理技術,它們不僅僅功能更強大,而且內部使用了字節碼增強實現,在性能上還也要比原生jdk高出很多。

javaassist

javaassist是使用最廣泛的動態代理開源庫。下面我們使用javaassist實現一個無需定義接口就能增強原始方法的例子。

import java.lang.reflect.Method;import javassist.util.proxy.MethodHandler; import javassist.util.proxy.ProxyFactory;class RealHello {public void say(String s) {System.out.println("hello " + s);}}class HelloDelegate<T> implements MethodHandler {private T target;public HelloDelegate(T target) {this.target = target;}@Overridepublic Object invoke(Object self, Method method, Method proceed, Object[] args) throws Throwable {System.out.println("before print");method.invoke(target, args);System.out.println("after print");return null;}}public class DynamicProxy {public static void main(String[] args) {RealHello hello = enhanceHello(new RealHello());hello.say("world");}@SuppressWarnings("unchecked")public static <T> T enhanceHello(T target) {ProxyFactory proxy = new ProxyFactory();proxy.setSuperclass(RealHello.class);try {HelloDelegate<T> delegate = new HelloDelegate<T>(target);// create方法傳遞了兩個空數組// 分別代表構造器的參數類型數組和構造器的參數實例數組return (T) proxy.create(new Class<?>[0], new Object[0], delegate);} catch (Exception e) {e.printStackTrace();}return null;}} 復制代碼

輸出

before print hello world after print 復制代碼

看起來和原生jdk提供的動態代理區別并不大,達到的效果是一樣的。只不過這里要簡單了很多,省去了接口類的定義。javaassist的ProxyFactory還提供了方法過濾器,它可以選擇性地對特定方法進行增強。

Python

Python是動態語言,對于上面復雜的動態代理技術,它一笑而過。

下面我們來看看Python如果實現所謂的動態代理功能

class Proxy(object):def __init__(self, target):self.target = targetdef __getattribute__(self, name):target = object.__getattribute__(self, "target")attr = object.__getattribute__(target, name)def newAttr(*args, **kwargs): # 包裝print "before print"res = attr(*args, **kwargs)print "after print"return resreturn newAttrclass RealHello(object):def prints(self, s):print 'hello', sif __name__ == '__main__':t = RealHello()p = Proxy(t)p.prints("world") 復制代碼

輸出

before print hello world after print 復制代碼

我們使用了神奇的__getattribute__方法。在Python里面類的屬性(方法)都是一個對象,我們先拿到這個類方法對象attr,然后對這個類方法對象進行包裝,再返回包裝后的新方法對象newAttr。 注意在獲取target對象時,不能直接使用self.target,因為self.target會再次調用__getattribute__方法,這樣就會導致死循環致堆棧過深曝出異常。取而代之應該使用object.__getattribute__方法來獲取對象的屬性值。

以上就是Python實現動態代理的方案,讀者們,你們是否覺得Python更加簡單呢?歡迎大家一起來評論區吵架。

精彩文章,關注公眾號「碼洞」

總結

以上是生活随笔為你收集整理的看完Java的动态代理技术——Pythoner笑了的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: eeuss鲁丝片一区二区三区 | 国产日韩一区二区在线 | 麻豆免费观看网站 | 欧美成人tv | 中国一级特黄录像播放 | 久久久久久久久久久久久久 | 色av一区| 香蕉久久夜色精品 | 岛国片在线播放 | 精品国产一区二区三区噜噜噜 | 日本va在线观看 | 婷婷综合在线视频 | 牛人盗摄一区二区三区视频 | 午夜一级在线 | 亚洲少妇15p | 黑人糟蹋人妻hd中文字幕 | 精品欧美黑人一区二区三区 | 久久久久国产精品无码免费看 | 精品一区二区三区入口 | 国产毛片18 | 美国黄色一级毛片 | 色小说香蕉| 亚洲激情视频 | 欧美在线视频你懂的 | 91精品国自产在线 | 日韩一区不卡视频 | 毛片在线免费播放 | 日韩一卡 | 熟妇人妻av无码一区二区三区 | 少妇29p | 国产乱了高清露脸对白 | 午夜h视频 | av中文在线 | 亚洲天堂精品在线 | 天天天天操 | 精品人妻一区二区三区潮喷在线 | 男女偷爱性视频刺激 | 亚洲精品美女在线观看 | 污片免费观看 | 欧美一区欧美二区 | 在线观看视频中文字幕 | 日韩视频 中文字幕 | 噜噜色av| 中国亚洲老头同性gay男男… | 欧美日韩人妻精品一区二区 | 国产精品500部 | 久久字幕 | 中文字幕在线三区 | 中文字幕一区二区免费 | 欧美国产高清 | 欧美激情精品久久久久久蜜臀 | 国产福利午夜 | 久久99精品久久久久久琪琪 | 嫩草影院菊竹影院 | 日本三级韩国三级三级a级中文 | 欧美精品一区二区蜜臀亚洲 | 亚洲国产精品va在线看黑人 | 日韩在线成人 | 免费大片黄在线观看视频网站 | 黑人干亚洲人 | 国产黄色激情视频 | 免费观看在线高清 | 在线视频 中文字幕 | 国产精品美女在线 | 欧美性色黄大片手机版 | 精品人妻av在线 | 国产深喉视频一区二区 | 成人精品视频99在线观看免费 | 国产精品久久久久久妇女 | 欧美日韩一卡二卡三卡 | 国产精品1024 | 狠狠久久久 | 精品一区91 | 看av在线 | 特黄一级毛片 | 大吊一区二区三区 | 国产小视频在线看 | 亚洲男女视频 | 成人精品一区二区三区中文字幕 | 公侵犯一区二区三区 | 亚洲人成在线观看 | 国产伦精品一区二区三区高清版 | 严厉高冷老师动漫播放 | 午夜免费 | 亚洲夜夜爽 | 日韩欧美精品 | 先锋av在线资源 | 狠狠干女人 | 午夜爱爱毛片xxxx视频免费看 | 日韩五码在线 | 2020国产精品| 亚洲av无码专区首页 | 蘑菇av | 国产成人无码久久久精品天美传媒 | 久久午夜影院 | 欧美高清免费 | 日本在线成人 | 日b视频免费看 | 国产性猛交xx乱 |