在前面一篇文章中,详解介绍了 cglib 的 Enhancer 及配合使用的各种回调,然后使用 Enhancer 实现了动态代理。
在这篇文章中, 再来介绍一下 cglib 的其他能力。
1. Bean 操作
Java Bean 是最常用的类型,cglib 提供了很多工具来操作这些 Bean,以满足各类需求。
Immutable Bean
ImmutableBean
用来生成不可变对象,如果强行修改,将会抛出 IllegalStateException
。
对原底线所有的改变都会反应到这个不可变对象。也就是可以通过修改原对象来修改这个不可变的对象。
HelloImpl helloImpl = new HelloImpl();helloImpl.setValue("ray");HelloImpl immutableBean = (HelloImpl) ImmutableBean.create(helloImpl);helloImpl.setValue("hello");System.out.println(helloImpl.getValue().equals("hello")); // trueSystem.out.println(immutableBean.getValue().equals("hello")); // trueimmutableBean.setValue("Hello ray"); //java.lang.IllegalStateException: Bean is immutable
Bean Generator
BeanGenerator
在运行时创建一个新的 Bean。在使用第三方库时,不确定类型,就可以使用这种方式来动态创建 Bean。
BeanGenerator beanGenerator = new BeanGenerator();beanGenerator.addProperty("value", String.class);Object myBean = beanGenerator.create();Method setter = myBean.getClass().getMethod("setValue", String.class);setter.invoke(myBean, "Hello cglib!");Method getter = myBean.getClass().getMethod("getValue");System.out.println("Hello cglib!".equals(getter.invoke(myBean))); // true
Bean Copier
BeanCopier
用来复制对象,可以复制同类型的 bean,也可以复制不同类型的 bean。
BeanCopier copier = BeanCopier.create(HelloImpl.class, HelloImpl.class, false); // 这里也可以是在不同的 bean 之间复制HelloImpl bean = new HelloImpl();bean.setValue("Hello cglib!");HelloImpl otherBean = new HelloImpl();copier.copy(bean, otherBean, null);System.out.println("Hello cglib!".equals(otherBean.getValue())); // true
而且还可以通过传入 Converter 参数来实现自定义拷贝规则,需要把 BeanCopier.create
的第三个参数设置为 true。
BeanCopier copier = BeanCopier.create(HelloImpl.class, HelloImpl.class, true); // 这里也可以是在不同的 bean 之间复制HelloImpl bean