CGLib(Code Generation Library)是一个强大的,高性能,高质量的字节码操作类库,它可以在运行期扩展Java类与实现Java接口,Spring、Hibernate等很多著名的框架都使用了它。
https://github.com/cglib/cglib/
其他的库还有:
Javassist (Java Programming Assistant)、
ASM、
Apache Commons BCEL(Byte Code Engineering Library)
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;
}
}
运行结果:
引用
id : [999] createdAt : [Mon May 31 00:00:00 CST 2010]
分享到:
相关推荐
CGLib动态代理是一种在Java编程中实现动态代理的技术,它主要通过字节码操作库ASM来生成目标类的子类,从而实现对目标类的方法拦截和增强。在Java中,当我们需要在运行时动态地创建对象并扩展其功能时,CGLib是一个...
接着,创建一个实现了`InvocationHandler`接口的类,重写`invoke()`方法,在其中添加额外的行为。最后,使用`Proxy.newProxyInstance()`创建代理对象,并通过代理对象调用方法。 ### CGLIB动态代理 CGLIB(Code ...
当目标类不支持接口时,CGlib可以创建目标类的子类,并在子类中拦截方法调用,从而实现动态代理。具体步骤如下: 1. 创建Enhancer对象:这是CGlib的核心类,它可以配置代理的创建过程,包括设置回调函数、代理类名...
CGlib是Java编程语言中的一个库,主要用于生成子类,以提供方法拦截和动态代理功能。它是对Bytecode Generation Library(字节码生成库)的一个封装,能够在运行时动态创建新类和对象,广泛应用于AOP(面向切面编程...
总结,CGlib是一个强大且灵活的工具,它通过字节码生成技术实现了对Java类的动态代理,尤其在没有接口约束或者性能要求高的情况下,它是Java开发者的重要助手。理解并熟练掌握CGlib的使用,能极大地提升开发效率和...
在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...
这种方法比使用Java的标准动态代理(java.lang.reflect.Proxy)更为灵活,因为Java的代理只能应用于实现了接口的类。 **主要使用场景**: 1. **AOP编程**: 在Spring框架中,如果目标类没有实现接口,Spring就会使用...
CGLib(Code Generation Library)是Java中一个高性能的代码生成库,它在运行期通过字节码技术为类创建子类,以此实现动态代理。 1. Maven项目配置 首先,我们需要在Maven项目的`pom.xml`文件中添加CGLib的依赖。在...
- 接下来,通过java.lang.reflect.Proxy类的newProxyInstance()方法,传入接口、实现类的类加载器以及自定义的InvocationHandler实现,生成动态代理对象。 - 最后,通过代理对象调用接口方法,实际上会触发...
它主要为Java应用程序提供一种方式来动态地生成子类,从而扩展已有类的功能或为已有的类添加新的行为。CGlib是许多其他流行框架,如Spring AOP和Hibernate,背后的重要技术之一。 在Java 17及更高版本中,CGlib继续...
CgLib是一个强大的Java字节码库,它允许开发者在运行时动态地创建新的类或增强现有的类。在Java世界中,动态代理是一种常见的编程模式,用于在运行时创建对象的代理,以便在调用真实对象的方法之前或之后执行额外的...
Java动态代理和CGLIB动态代理是两种在Java开发中常用的面向切面编程(AOP)技术,主要用于在运行时创建具有额外功能的对象。这两者都允许我们在不修改原有代码的情况下,为对象添加额外的行为,如日志记录、事务管理...
CGlib是Java编程语言中的一个库,主要用于生成子类,以此实现对现有类的动态代理。它是基于ASM库,能够直接操作字节码,从而在运行时创建新类的实例。在Java中,CGlib是一个非常重要的工具,特别是在AOP(面向切面...
动态代理主要用于创建一个代理对象,这个代理对象可以代替原始目标对象执行方法,并在调用前后添加额外的操作。例如,日志记录、性能监控等。InvocationHandler接口定义了一个方法`invoke()`,它在代理对象调用任何...
### Java动态代理(JDK和cglib) #### 一、代理模式概述 代理模式是一种结构型设计模式,其中代理类含有一个对真实主题对象的引用,这样代理对象就可以执行一些预备或清理工作,并将真正的调用传递给真实主题对象...
Cglib动态代理是Java开发中常用的一种技术,它允许我们为现有的类创建子类,并在子类中拦截方法调用。Cglib库通常与Spring框架一起使用,用于实现AOP(面向切面编程)的功能,如事务管理、日志记录等。在这个场景下...
在Java开发中,CGLIB经常被用作AOP(面向切面编程)的底层实现,例如Spring框架就使用了CGLIB来实现对目标类的动态代理。 CGLIB是通过字节码技术来实现动态代理的。当我们的应用程序需要动态地创建一个类的实例或者...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建对象的代理,从而可以在调用实际方法之前和之后添加额外的行为。本篇将深入探讨两种主要的Java动态代理技术:JDK动态代理和CGLIB。 首先,我们来...
在Java中,通过动态代理可以实现在运行时为对象添加新的行为,而无需修改原始代码。 动态代理有两种主要实现方式:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口,如果目标类实现了至少一个接口,就可以使用JDK...