public class CGLibExample {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
// 定义一个参数是字符串类型的setCreatedAt方法
InterfaceMaker im = new InterfaceMaker()
im.add(new Signature("setCreatedAt", Type.VOID_TYPE,
new Type[] { Type.getType(String.class) }), null)
Class myInterface = im.create()
Enhancer enhancer = new Enhancer()
enhancer.setSuperclass(ExampleBean.class)
enhancer.setInterfaces(new Class[] { myInterface })
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
ExampleBean bean = (ExampleBean) obj
// 调用字符串类型的setCreatedAt方法时,转换成Date型后调用Setter
if (method.getName().startsWith("setCreatedAt")
&&args[0] != null &&args[0] instanceof String) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd")
Date date = null
try {
date = sdf.parse((String) args[0])
} catch (final Exception e) { /* nop */ }
bean.setCreatedAt(date)
return null
}
return proxy.invokeSuper(obj, args)
}
})
// 生成一个Bean
ExampleBean bean = (ExampleBean) enhancer.create()
bean.setId(999)
try {
Method method = bean.getClass().getMethod("setCreatedAt", new Class[] {String.class})
method.invoke(bean, new Object[]{"20100531"})
} catch (final Exception e) {
e.printStackTrace()
}
System.out.printf("id : [%d] createdAt : [%s]\n", bean.getId(), bean.getCreatedAt())
}
}
class ExampleBean implements Serializable {
private static final long serialVersionUID = -8121418052209958014L
private int id
private Date createdAt
public int getId() {
return id
}
public void setId(int id) {
this.id = id
}
public Date getCreatedAt() {
return createdAt
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt
}
}
statement:本篇内容只是建立在我目前经验的基础之上,必然有不完善甚至是不正确的地方,请谨慎阅读,如果能指出错误与不足之处,更是不甚感激
附:本篇内容旨在基本探究一下CGLib提供了哪些功能,并提供基础示例和使用方法,本文主要内容来自于Rafael Winterhalter的文章《CGLib: The Missing Manual》,并在此基础上进行一些添加与修正。本篇内容将可能会被多次更新(如果有更深的理解,或者是需要添加的说明之处)
CGLib是一个基于ASM字节码 *** 纵框架之上的类生成工具,相比于底层的ASM,CGLib不需要你理解那么多必需的和字节码相关底层知识,你可以很轻松的就在运行时动态生成一个类或者一个接口。CGLib广泛应用于AOP方面和代理方面,比如Spring、Hibernate,甚至也可以用于Mock测试方面。
CGLib有些地方需要提前引起注意,至于原因为何,我将会在最后一节说明。
参考文档:
[1] CGLib: The Missing Manual
[2] https://github.com/cglib/cglib/wiki/How-To
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)