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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cglib invoke 和 invokeSuper 可用的组合

發(fā)布時(shí)間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cglib invoke 和 invokeSuper 可用的组合 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在深入字節(jié)碼理解invokeSuper無限循環(huán)的原因中,我們理解的cglib的原理和其中一個(gè)合理的調(diào)用方式。但是這個(gè)調(diào)用方式是基于類的,對(duì)所有實(shí)例生效。實(shí)際場(chǎng)景中,我們可能只是希望代理某個(gè)具體的實(shí)例,而且這個(gè)實(shí)例會(huì)有自己的特有屬性。這個(gè)時(shí)候要怎么做呢?

?

public class CglibDynamicProxyDemo {static class SampleClass {public void print(){System.out.println("hello world");}}public static void main(String[] args) {SampleClass sampleClass = new SampleClass();SampleClass sample = createCglibDynamicProxy(sampleClass);sample.print();}private static SampleClass createCglibDynamicProxy(SampleClass delegate) {Enhancer enhancer = new Enhancer();enhancer.setCallback(new CglibInterceptor(delegate));enhancer.setSuperclass(SampleClass.class);return (SampleClass) enhancer.create();}private static class CglibInterceptor implements MethodInterceptor {private Object delegate;public CglibInterceptor(Object delegate) {this.delegate = delegate;}@Overridepublic Object intercept(Object o, Method method, Object[] objects, net.sf.cglib.proxy.MethodProxy methodProxy) throws Throwable {return methodProxy.invokeSuper(delegate, objects);}} }

?

通常我們會(huì)生成一個(gè)攔截器類,然后把實(shí)例傳遞進(jìn)去,調(diào)用的時(shí)候使用被代理的對(duì)象。

執(zhí)行代碼:

Exception in thread "main" java.lang.ClassCastException: com.ym.materials.proxy.CglibDynamicProxyDemo$SampleClass cannot be cast to com.ym.materials.proxy.CglibDynamicProxyDemo$SampleClass$$EnhancerByCGLIB$$db74855eat com.ym.materials.proxy.CglibDynamicProxyDemo$SampleClass$$EnhancerByCGLIB$$db74855e$$FastClassByCGLIB$$6a2a8700.invoke(<generated>)at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)at com.ym.materials.proxy.CglibDynamicProxyDemo$CglibInterceptor.intercept(CglibDynamicProxyDemo.java:42)at com.ym.materials.proxy.CglibDynamicProxyDemo$SampleClass$$EnhancerByCGLIB$$db74855e.print(<generated>)at com.ym.materials.proxy.CglibDynamicProxyDemo.main(CglibDynamicProxyDemo.java:22)

異常了,why?

通過前面的分析,我們知道invokeSuper調(diào)用fci.f2.invoke(fci.i2, obj, args),使用的是第三個(gè)生成類SampleClass$$EnhancerByCGLIB$$8ed28f$$FastClassByCGLIB$$520b645b,方法簽名是:CGLIB$test$0

通過方法簽名的hashcode映射后得到索引為16

6 case -1659809612: 7 if(var10000.equals("CGLIB$test$0()V")) { 8 return 16; 9 } 10 break; ? 1 public class SampleClass$$EnhancerByCGLIB$$8ed28f$$FastClassByCGLIB$$520b645b extends FastClass { 2 3 public Object invoke(int var1, Object var2, Object[] var3) throws InvocationTargetException { 4 8ed28f var10000 = (8ed28f)var2; 5 int var10001 = var1; 6 7 try { 8 switch(var10001) { 9 case 7: 10 var10000.test(); 11 return null; 12 case 16: 13 var10000.CGLIB$test$0(); 14 return null; 15 } catch (Throwable var4) { 16 throw new InvocationTargetException(var4); 17 } 18 19 throw new IllegalArgumentException("Cannot find matching method/constructor"); 20 } 21 }

調(diào)用的時(shí)候,會(huì)先進(jìn)行類型轉(zhuǎn)換。這樣問題就來了,我們傳入的delegate是一個(gè)sampleClasss實(shí)例,而不是新生成的對(duì)象,所以類型轉(zhuǎn)換出錯(cuò)。所以如果代理具體實(shí)例,正確的寫法是:

1 private static class CglibInterceptor implements MethodInterceptor { 2 3 private Object delegate; 4 5 public CglibInterceptor(Object delegate) { 6 this.delegate = delegate; 7 } 8 9 @Override 10 public Object intercept(Object o, Method method, Object[] objects, net.sf.cglib.proxy.MethodProxy methodProxy) throws Throwable { 11 return methodProxy.invoke(delegate, objects); 12 } 13 }

?

總結(jié):

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

如果代理的類本身,需要使用

public Object intercept(Object o, Method method, Object[] objects, net.sf.cglib.proxy.MethodProxy methodProxy) throws Throwable {return methodProxy.invoke(o, objects); }

如果代理的是實(shí)例,需要使用

public Object intercept(Object o, Method method, Object[] objects, net.sf.cglib.proxy.MethodProxy methodProxy) throws Throwable {return methodProxy.invoke(delegate, objects); }

?



?

轉(zhuǎn)載于:https://www.cnblogs.com/yangmengdx3/p/9221806.html

總結(jié)

以上是生活随笔為你收集整理的cglib invoke 和 invokeSuper 可用的组合的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 麻豆91精品 | 一区二区三区高清在线观看 | 亚洲视屏在线观看 | 成人蜜桃av | 最新av在线播放 | 欧州一区二区三区 | 狠狠干狠狠干狠狠干 | 国产农村妇女精品一二区 | 色天使在线视频 | 91精品导航 | 免费的三级网站 | 成人夜晚看av | 一本到久久 | 成年黄色网 | 日韩一区二区三区在线免费观看 | 日韩欧美xxx| 极品少妇一区二区三区 | 樱花电影最新免费观看国语版 | 老女人毛片50一60岁 | 在线免费观看国产 | 国产精品一线二线 | 黄色香蕉视频 | 强伦人妻一区二区三区视频18 | 久久97视频| 日韩色综合 | 91精品国产一区二区三竹菊影视 | 中文字幕第2页 | 国产白浆一区二区 | 欧美另类极品videosbest使用方法 | 国产老妇伦国产熟女老妇视频 | 性生交大片免费看l | 二区在线播放 | 波多野结衣视频一区二区 | 欧美一区二区久久 | 久久久77 | 深爱激情久久 | 国产精品无码久久久久成人app | 日本福利小视频 | 天天插日日干 | 亚洲av成人精品一区二区三区 | 五月激情五月婷婷 | www.伊人久久 | 国产亚洲精品成人av在线 | 二区视频在线 | 中文字幕亚洲不卡 | 波多野结衣一二三四区 | 伊人青青久久 | 国产一区二区在线观看视频 | 亚洲成人av在线 | 国产第二页 | 国产videos | 女女同性女同一区二区三区九色 | 日韩在线免费 | 一区二区在线影院 | 亚洲国产午夜 | 舔花蒂| √资源天堂中文在线视频 | 国产 欧美 在线 | 国产成人视屏 | 五月天丁香久久 | 日韩大尺度视频 | 大地资源影视在线播放观看高清视频 | 中文字幕av第一页 | 一区二区三区国产精品 | 精品久久久噜噜噜久久久 | 人体裸体bbbbb欣赏 | 免费毛片视频网站 | 91免费版在线| 日韩精品在线视频观看 | a级一a一级在线观看 | 亚洲少妇一区二区三区 | 在线观看911视频 | 人妻少妇偷人精品无码 | 91在线观看视频网站 | 性折磨bdsm欧美激情另类 | 色撸撸在线观看 | 日韩在线影院 | 免费看黄色片的网站 | 毛茸茸亚洲孕妇孕交片 | 国产乱大交 | 国产精品后入内射日本在线观看 | 亚洲欧美日韩专区 | av卡一卡二 | 伊人涩涩 | 国产午夜福利一区二区 | 久久久久久国产精品三级玉女聊斋 | 欧美a级片视频 | 都市乱淫 | 久久天天躁狠狠躁夜夜躁2014 | 国产精品无码久久久久高潮 | 美乳人妻一区二区三区 | 91高潮大合集爽到抽搐 | 中文字幕精品无 | 国产成人精品自拍 | 亚洲黄色a级片 | 在线观看国产黄色 | 麻豆网页 | 亚洲同性gay激情无套 | 国产精品国产三级国产aⅴ原创 |