`
ostriches
  • 浏览: 1812 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hibernate底层技术简介 CGLIB

阅读更多
从可以看到,基于ASM的开发很复杂,需要了解JVM的底层编码。CGLIB以ASM为基础, 对ASM的功能进行了扩展和封装,提供了更友好的API,部分通用的模版和高级的功能实现。CGLIB的具体功能如下:

(1)扩展ASM的Visitor模式。在ASM的Visitor模式的基础上利用ClassEmitter和CodeEmitter将Visitor事件封装为更符合Java开发者习惯的事件。

(2)实现了Java的反射功能。CGLIB不仅可以替代java的反射功能,而且还提供了更强大的功能,例如CGLIB的Enhancer既可以强化子类,也可以扩充接口,与各种Callback配合可以实现许多功能。

(3)Transform编程接口。利用Transform可以很容易的实现各种面向实际需要的Transformer,来执行类转化的Transform过程,为Hibernate提供了底层框架的支持。

1. Proxy

CGLIB实现了Java反射技术的功能,实现了CGLIB方式的Proxy和InvocationHandler完全可以代替Java的反射接口。

2. Enhancer

Enhancer可以更容易的动态实现接口。举例如下:

package com.weportal.cglib.enhancer;

public interface Teller {
    public void tell();
    public void test();    
}
利用实现接口MethodInterceptor接口的EchoCaller来处理Teller的方法。

package com.weportal.cglib.enhancer;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class EchoCaller implements MethodInterceptor {

    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        String echoMsg = "调用的方法是"+method.getName();
        System.out.println(echoMsg);
        return echoMsg;
    }
}
通过Enhancer可以实现一个Teller,实现的方法是用EchoCaller来拦截。

package com.weportal.cglib.enhancer;

import net.sf.cglib.proxy.Enhancer;

public class EnhancerInterfaceTest {

    public static void main(String[] args) {
        EchoCaller ec = new EchoCaller();
        Enhancer eh = new Enhancer();
        eh.setSuperclass(Teller.class);
        eh.setCallback(ec);
        Teller teller = (Teller)eh.create();
        teller.tell();
        teller.test();       
    }
}

执行的结果如下:

调用的方法是tell
调用的方法是test

在这里,Enhancer是Teller的子类。

3. KeyFactory

是一个可以用来处理一组关键字集合的工厂类。通过这个工厂类,可以产生处理各种数据类型和集合顺序的关键字组的工厂类。例如:

package com.weportal.cglib.keyfactory;

public interface MapKeyFactory {
    public Object newInstance(int a, String[] b, boolean c);
}
MapKeyFactory可以生成“int a, String[] b, boolean c”结构的数据集合。利用KeyFactory可以实现MapKeyFactory,并产生对应结构数据集合的实例。

package com.weportal.cglib.keyfactory;

import net.sf.cglib.core.KeyFactory;

public class MapKeyExample {

    public static void main(String[] args) {
        MapKeyFactory f = (MapKeyFactory)KeyFactory.create(MapKeyFactory.class);
        Object key1 = f.newInstance(26, new String[]{"String 01", "String 02" }, true);
        Object key2 = f.newInstance(26, new String[]{"String 00", "String 02" }, true);
        Object key3 = f.newInstance(26, new String[]{"String 01", "String 02" }, true);
        System.out.println(key1.equals(key2));
        System.out.println(key1.equals(key3));       
    }
}
程序的运行结果是:

false
true

4. BulkBean

是CGLIB提供的处理JavaBean业务的工具,通过BulkBean,可以间接左右目标Bean的操作。例如:

package com.weportal.cglib.bulkbean;

public class TargetBean {
    TargetBean(){
       
    }
    private String name;
    private String time;
    private Integer number;   
    /**
     * @return Returns the name.
     */
    public String getName() {
        return name;
    }
    /**
     * @param name The name to set.
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return Returns the number.
     */
    public Integer getNumber() {
        return number;
    }
    /**
     * @param number The number to set.
     */
    public void setNumber(Integer number) {
        this.number = number;
    }
    /**
     * @return Returns the time.
     */
    public String getTime() {
        return time;
    }
    /**
     * @param time The time to set.
     */
    public void setTime(String time) {
        this.time = time;
    }
}

下面是使用BulkBean处理TargetBean的代码:

package com.weportal.cglib.bulkbean;

import net.sf.cglib.beans.BulkBean;

public class BulkBeanTest {

    public static void main(String[] args) {
        String getters[] = new String[] { "getName", "getTime", "getNumber" };
        String setters[] = new String[] { "setName", "setTime", "setNumber" };
        Class types[] = new Class[] { String.class, String.class, Integer.class };
        BulkBean bb = BulkBean
                .create(TargetBean.class, getters, setters, types);
        TargetBean tb = new TargetBean();
        tb.setName("张三");
        tb.setNumber(new Integer(20));
        tb.setTime("2005-12-23");
        Object objs[] = bb.getPropertyValues(tb);
        for (int i = 0; i < objs.length; i++) {
            System.out.println(objs[i]);
        }
    }
}

程序的运行结果如下:

张三
2005-12-23
20

结论:BulkBean和TargetBean联系起来,保持同步。BulkBean的这种方式是Hibernate操作持久化类的技术基础。

5. Transformer

通过CGLIB来增强类的功能,需要借助底层的Class转换过程。CGLIB希望提供一些成熟的面向单一功能的转换器,如同XML转换系统中积累的XSLT,在CGLIB中被实现为Transformer框架。不同类型的Transformer在CGLIB中起到的作用都不一样,但是它们之间可以连接起来。
分享到:
评论

相关推荐

    CGLIB入门实例.doc

    Hibernate底层技术简介 CGLIB

    cglib.jar下载

    CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。 CGLIB缺点:对于final方法,无法进行代理。 三、CGLIB的...

    基于java的企业级应用开发:JDK动态代理.ppt

    CGLIB代理 CGLIB(Code Generation Library)是一个高性能开源的代码生成包,它采用非常底层的字节码技术,对指定的目标类生成一个子类,并对子类进行增强。 如果想代理没有实现接口的类,那么可以使用CGLIB代理。 ...

    Spring 2.0 开发参考手册

    3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 4.2. Resource 接口 4.3. 内置 Resource 实现 ...

    spring chm文档

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动...

    Spring-Reference_zh_CN(Spring中文参考手册)

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动代理...

    Spring.3.x企业应用开发实战(完整版).part2

    2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 2.3.2 UserDao 2.3.3 LoginLogDao 2.3.4 在Spring中装配DAO 2.4 业务层 2.4.1 ...

    Spring API

    3.8.4. 底层资源的访问 3.8.5. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.10. 以J2EE RAR文件的形式部署Spring ApplicationContext 3.11. 基于注解(Annotation-based)的配置 ...

    Spring3.x企业应用开发实战(完整版) part1

    2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 2.3.2 UserDao 2.3.3 LoginLogDao 2.3.4 在Spring中装配DAO 2.4 业务层 2.4.1 ...

    Spring中文帮助文档

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动...

    spring学习笔记

    Spring的Ioc Spring的AOP , AspectJ Spring的事务管理 , 三大框架的整合 目录 1.1 Spring 框架学习路线:..........................................................................................................

Global site tag (gtag.js) - Google Analytics