cglib

CGLIB

CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。CGLIB作为一个开源项目,地址为:https://github.com/cglib/cglib

主要使用方式:
Enhancer:允许代理扩展一个具体的基类,还可以实现实现接口,动态生成的子类覆盖超类的非final方法(final不能被继承,重写),并具有回调用户定义的拦截器的钩子(callback方法)
最常用的callback是MethodInterceptor,实现AOP方法执行前后和抛出异常时执行(Around advice)–在调用超类方法之前之后都可以调用调用自定义代码。另外在调用超类的方法之前可以修改参数,或根本不调用它。

Enhancer

 public class SampleClass2 {
    public String test(String input) {
        return "Hello world!";
    }

    @Test
    public void testFixedValue() throws Exception {
        Enhancer enhancer = new Enhancer();
        // 设置要代理的目标类
        enhancer.setSuperclass(SampleClass2.class);
        // 设置要代理的拦截器
        enhancer.setCallback(new FixedValue() {
            @Override
            public Object loadObject() throws Exception {
                return "Hello cglib!";
            }
        });
        // 生成代理类的实例 
        SampleClass2 proxy = (SampleClass2) enhancer.create();
        assertEquals("Hello cglib!", proxy.test(null));
    }
}

KeyFactory:主要处理Maps 和 Sets集合,适用于多键值对

public class KeySample {
//实现一个newInstance的接口,返回值是Object(必须)
    private interface MyFactory {
        public Object newInstance(int a, char[] b, String d);
    }
    public static void main(String[] args) {
        MyFactory f = (MyFactory)KeyFactory.create(MyFactory.class);
        Object key1 = f.newInstance(20, new char[]{ 'a', 'b' }, "hello");
        Object key2 = f.newInstance(20, new char[]{ 'a', 'b' }, "hello");
        Object key3 = f.newInstance(20, new char[]{ 'a', '_' }, "hello");
        System.out.println(key1.equals(key2));
        System.out.println(key2.equals(key3));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值