首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

CGLIB引见<转>

2012-08-21 
CGLIB介绍转代理分为静态代理和动态代理。静态代理和动态代理不在这里详述,大家都知道动态代理的类必须是

CGLIB介绍<转>
   代理分为静态代理和动态代理。
    静态代理和动态代理不在这里详述,大家都知道动态代理的类必须是要实现接口的,如果没有实现接口的话,那应该怎么办呢?
    那么我们可以使用CGLIB,在Spring和Hibernate中大量使用了CGLIB,所以我们又必要了解一下。
    CGLIB(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。Hibernate主要是利用cglib生成pojo的子类并override get方法来实现lazy loading机制,Spring则是利用cglib来实现动态代理。
    CGLIB代理最核心的是net.sf.cglib.proxy.Enhancer类,为了创建一个代理,最起码你要用到这个类。首先,让我们使用NoOp回调创建一个代理:

**      * Create a proxy using NoOp callback. The target class      * must have a default zero-argument constructor.      *      * @param targetClass the super class of the proxy      * @return a new proxy for a target class instance      */     public Object createProxy(Class targetClass) {          Enhancer enhancer = new Enhancer();          enhancer.setSuperclass(targetClass);          enhancer.setCallback(NoOp.INSTANCE);          return enhancer.create();     }  


返回值是target类一个实例的代理。在这个例子中,我们为net.sf.cglib.proxy.Enhancer 配置了一个单一的回调(callback)。我们可以看到很少直接创建一个简单的代理,而是创建一个net.sf.cglib.proxy.Enhancer的实例,在net.sf.cglib.proxy.Enhancer类中你可使用静态帮助方法创建一个简单的代理。一般推荐使用上面例子的方法创建代理,因为它允许你通过配置net.sf.cglib.proxy.Enhancer实例很好的控制代理的创建。

要注意的是,target类是作为产生的代理的父类传进来的。不同于JDK的动态代理,它不能在创建代理时传target对象,target对象必须被CGLIB包来创建。在这个例子中,默认的无参数构造器时用来创建target实例的。如果你想用CGLIB来创建有参数的实例,用net.sf.cglib.proxy.Enhancer.create(Class[], Object[])方法替代net.sf.cglib.proxy.Enhancer.create()就可以了。方法中第一个参数定义了参数的类型,第二个是参数的值。在参数中,基本类型应被转化成类的类型。

                                        转自http://www.iteye.com/topic/98178

热点排行