posts - 165, comments - 198, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          CGLib 學(xué)習(xí)

          Posted on 2007-11-05 10:22 G_G 閱讀(5794) 評(píng)論(3)  編輯  收藏 所屬分類: AOP
          看hbn 源代碼 發(fā)現(xiàn)用了 CGlib 這就看看這個(gè)jar 。特留個(gè)文 ^_^(轉(zhuǎn))http://www.nirvanastudio.org/java/cglib-%E6%8C%87%E5%8D%97.html

          CGlib 就2個(gè)例能說明一切?
          先是使用類? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
          public?class?MyClass?{
          ?
          ????
          public?void?method()?{
          ????????System.out.println(
          "MyClass.method()");
          ????}

          ????
          public?void?method2()?{
          ????????System.out.println(
          "MyClass.method2()");
          ????}
          }

          例1:
          import?java.lang.reflect.Method;
          ?
          import?net.sf.cglib.proxy.Enhancer;
          import?net.sf.cglib.proxy.MethodProxy;
          import?net.sf.cglib.proxy.MethodInterceptor;
          ?
          public?class?Main?{
          ?
          ????
          public?static?void?main(String[]?args)?{
          ?
          ????????Enhancer?enhancer?
          =?new?Enhancer();
          ??? ??
          ??? ??? //在這代理了
          ????????enhancer.setSuperclass(MyClass.
          class);
          ????????enhancer.setCallback(?
          new?MethodInterceptorImpl()?);
          ?
          ??????? // 創(chuàng)造 代理 (動(dòng)態(tài)擴(kuò)展了MyClass類)
          ????????MyClass?my?
          =?(MyClass)enhancer.create();
          ?
          ????????my.method();
          ????}
          ?
          ????
          private?static?class?MethodInterceptorImpl?implements?MethodInterceptor?{
          ????????
          ????????
          public?Object?intercept(Object?obj,?
          ????????????????????????????????Method?method,?
          ????????????????????????????????Object[]?args,?
          ????????????????????????????????MethodProxy?proxy)?
          throws?Throwable?{
          ?
          ????????????System.out.println(method);
          ?
          ????????????proxy.invokeSuper(obj,?args);
          ?
          ????????????
          return?null;
          ????????}
          ????}
          }


          例2:
          import?java.lang.reflect.Method;


          import?net.sf.cglib.proxy.Enhancer;
          import?net.sf.cglib.proxy.MethodProxy;
          import?net.sf.cglib.proxy.MethodInterceptor;
          import?net.sf.cglib.proxy.NoOp;
          import?net.sf.cglib.proxy.Callback;
          import?net.sf.cglib.proxy.CallbackFilter;
          ?
          ?
          public?class?Main2?{
          ?
          ????
          public?static?void?main(String[]?args)?{
          ?
          ????????Callback[]?callbacks?
          =
          ????????????
          new?Callback[]?{?new?MethodInterceptorImpl(),??NoOp.INSTANCE?};
          ?
          ????????Enhancer?enhancer?
          =?new?Enhancer();
          ?
          ????????enhancer.setSuperclass(MyClass.
          class);
          ????????enhancer.setCallbacks(?callbacks?);
          ??????? //添加 方法過濾器? 返回1為不運(yùn)行 2 為運(yùn)行
          ????????enhancer.setCallbackFilter(?
          new?CallbackFilterImpl()?);
          ?
          ?
          ????????MyClass?my?
          =?(MyClass)enhancer.create();
          ?
          ????????my.method();
          ????????my.method2();
          ????}
          ?
          ????
          private?static?class?CallbackFilterImpl?implements?CallbackFilter?{
          ?
          ????????
          public?int?accept(Method?method)?{
          ?
          ????????????
          if?(?method.getName().equals("method2")?)?{
          ????????????????
          return?1;
          ?
          ????????????}?
          else?{
          ????????????????
          return?0;
          ????????????}
          ????????}
          ????}
          ?
          ????
          private?static?class?MethodInterceptorImpl?implements?MethodInterceptor?{
          ????????
          ????????
          public?Object?intercept(Object?obj,?
          ????????????????????????????????Method?method,?
          ????????????????????????????????Object[]?args,?
          ????????????????????????????????MethodProxy?proxy)?
          throws?Throwable?{
          ?
          ????????????System.out.println(method);
          ?
          ????????????
          return?proxy.invokeSuper(obj,?args);
          ????????}
          ????}
          }


          簡單不 哈哈 比jdk 中的動(dòng)態(tài)代理好用 ,那還要接口? 不太方便 。

          評(píng)論

          # re: CGLib 學(xué)習(xí)  回復(fù)  更多評(píng)論   

          2007-11-07 10:03 by 雨奏
          @G_G
          兄弟能否說說用CGLIB有哪些限制或副作用?

          # re: CGLib 學(xué)習(xí)  回復(fù)  更多評(píng)論   

          2007-11-09 17:11 by G_G
          @雨奏
          限制或副作用到?jīng)]感覺到
          但功能明顯太單薄了
          和aspectj沒的比 切入表達(dá)式 的aspectj 和只可以硬編碼的切CGlib
          的功能用下就知道 CGlib 太簡單了
          但他好用,好上手,給5分鐘就上了

          aspectj 我花了2星期才到理解程度 呵呵

          # re: CGLib 學(xué)習(xí)  回復(fù)  更多評(píng)論   

          2009-01-16 17:07 by Hill
          請(qǐng)問一下。你真的可以運(yùn)行嗎?我前幾天做了一個(gè)和你這個(gè)差不多的。總報(bào)錯(cuò)。請(qǐng)指點(diǎn)一下啊。
          net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
          at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:237)
          at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
          at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
          at spring.AOPInstrument.getInstrumentedClass(AOPInstrument.java:28)
          at spring.CGLibTest.main(CGLibTest.java:24)
          Caused by: java.lang.reflect.InvocationTargetException
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:324)
          at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:384)
          at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219)
          ... 4 more
          Caused by: java.lang.SecurityException: class "spring.MessageWriter$$EnhancerByCGLIB$$29bc061d"'s signer information does not match signer information of other classes in the same package
          at java.lang.ClassLoader.checkCerts(ClassLoader.java:611)
          at java.lang.ClassLoader.defineClass(ClassLoader.java:532)
          ... 10 more
          Exception in thread "main"

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 昌黎县| 广西| 新邵县| 昭通市| 沂源县| 原平市| 株洲县| 个旧市| 垣曲县| 本溪市| 石台县| 南靖县| 梨树县| 灌云县| 大同县| 元氏县| 芦山县| 澎湖县| 花莲县| 玉龙| 阿勒泰市| 南陵县| 昭苏县| 泗水县| 象山县| 普洱| 陇川县| 云和县| 手游| 扬州市| 麻栗坡县| 靖宇县| 东兴市| 兴义市| 桓仁| 盖州市| 南通市| 阳信县| 云龙县| 罗城| 阿拉尔市|