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

          CGLib 學習

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

          CGlib 就2個例能說明一切?
          先是使用類? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
          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()?);
          ?
          ??????? // 創造 代理 (動態擴展了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為不運行 2 為運行
          ????????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 中的動態代理好用 ,那還要接口? 不太方便 。

          評論

          # re: CGLib 學習  回復  更多評論   

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

          # re: CGLib 學習  回復  更多評論   

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

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

          # re: CGLib 學習  回復  更多評論   

          2009-01-16 17:07 by Hill
          請問一下。你真的可以運行嗎?我前幾天做了一個和你這個差不多的??倛箦e。請指點一下啊。
          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"
          主站蜘蛛池模板: 镇雄县| 岳阳县| 三门县| 吴桥县| 会东县| 丰原市| 宽甸| 迭部县| 儋州市| 南华县| 仁怀市| 湘潭县| 开化县| 特克斯县| 曲松县| 安陆市| 黔南| 青田县| 富顺县| 农安县| 大冶市| 冀州市| 苍南县| 长顺县| 清苑县| 南靖县| 微山县| 贺州市| 阳东县| 盐边县| 工布江达县| 十堰市| 佛冈县| 商水县| 汝州市| 沅江市| 武冈市| 吉林市| 枣强县| 绥阳县| 胶州市|