import java.lang.reflect.Method;
import com.dao.impl.PersonDaoImpl;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
//当代理对象没有实现接口,我们就可以 使用CGLIB生成代理 ,需要我们使用 cglib-nodep-2.1_3.jar
public class CGlibProxyFactory implements MethodInterceptor {
private Object targetObject;// 代理的目标对象
public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();// 该类用于生成代理对象
enhancer.setSuperclass(this.targetObject.getClass());// 设置父类
enhancer.setCallback(this);// 设置回调用对象为本身
return enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
PersonDaoImpl bean = (PersonDaoImpl) this.targetObject;
Object result = null;
if(bean.getUser()!=null){
try {
result = methodProxy.invoke(this.targetObject, args);;
} catch (RuntimeException e) {
}
}
return result;
}
}
分享到:
相关推荐
springAOP等框架中,大量用到代理技术; 两类代理技术: 1,java动态代理,见JDK文档或相关java书;...2.cglib创建代理类,比第一种更加简单,代理类和背代理类不需要实现共同接口。本例子就是cglib代理的例子,很简单
在Java编程中,动态代理是一种在运行时创建代理类和对象的技术,可以用于拦截方法调用,实现AOP(面向切面编程)或者为已有接口或类提供额外功能。CGlib是Java动态代理的一种实现方式,它不是依赖于Java的反射机制,...
1. **AOP编程**: 在Spring框架中,如果目标类没有实现接口,Spring就会使用CGlib来创建代理对象,以便在方法调用前后插入切面逻辑。 2. **性能优化**: 通过动态生成字节码,CGlib可以创建比反射更快的对象实例,这...
2. **创建代理对象**:使用`Enhancer`类,设置回调接口`MethodInterceptor`,并指定被代理的目标对象。然后调用`create()`方法,即可得到代理对象。 3. **拦截方法**:在`MethodInterceptor`的`intercept()`方法中...
CGLIB通过字节码技术生成代理类,能够在运行时动态创建子类并扩展目标对象,从而实现代理功能。这种代理方式相对于Java自带的JDK动态代理(基于接口的代理)来说,对目标类没有接口限制,更具有灵活性。 要使用...
CGLIB(Code Generation Library)是另一个常用的Java代理库,它不需要目标类实现任何接口,而是通过继承的方式创建代理类。CGLIB使用ASM库在运行时动态生成字节码,创建目标类的子类,从而实现对目标类方法的增强。...
当我们通过`enhancer.create()`创建代理对象并调用`myMethod`时,可以看到在实际方法执行前后,我们插入的逻辑得到了执行。 CGlib库不仅仅用于动态代理,还可以用于其他场景,比如性能优化(通过生成子类优化方法...
在内存占用上,两者差别不大,但CGLIB生成的代理类可能略微增加内存负担。 在工具支持上,Spring框架对两者都有很好的支持。Spring AOP默认使用JDK动态代理,但如果目标类没有实现接口,它会自动切换到CGLIB。在...
- 测试代码:展示如何使用Proxy创建代理对象并调用方法 2. CGLib代理项目: - src/main/java:包含目标类 - target/classes:编译后的class文件,包括目标类的class文件,以及由CGLib生成的子类class文件 - ...
Cglib通过继承机制来创建代理对象,因为不是所有的类都可以被代理,那些final类或者包含final方法的类是无法通过继承来创建子类的。但大部分情况下,我们可以通过Cglib来为一个类创建子类,并在子类中拦截方法调用,...
在 intercept() 方法中,我们可以使用 MethodProxy 对象调用被代理类的原始方法。例如: ```java public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws ...
创建被代理类、创建代理类、代理类内部聚合被代理类 * 2.创建返回代理类实例方法 Enhancer.create(object.getClass(), this); * (1.创建工具类,2.设置工具类的父类为被代理类 3.设计监听回调为当前this 4.return ...
1. 创建Enhancer对象:这是CGlib的核心类,它可以配置代理的创建过程,包括设置回调函数、代理类名等。 2. 设置回调函数:通常我们使用MethodInterceptor接口实现回调函数,这个接口定义了一个intercept()方法,当...
与JDK动态代理不同,CGLIB并不依赖接口,而是通过字节码技术生成一个被代理类的子类来实现。这使得CGLIB能够代理没有实现接口的类。CGLIB的核心是ASM库,它能直接操作字节码生成新的类。在Spring中,如果目标类没有...
1. Enhancer:主要用来创建代理对象,可以设置拦截器、父类等信息。 2. Callback:接口,提供了拦截方法调用的抽象,CGlib中的MethodInterceptor是它的实现。 3. MethodInterceptor:用于拦截和处理方法调用,实现...
- CGlib生成的代理类会继承目标类,所以如果目标类声明为final,CGlib将无法创建代理。 - 对于包含final方法的目标类,CGlib也无法在这些方法上添加拦截器。 - 如果目标类中包含静态方法,CGlib代理不会影响静态方法...
1. **cglib** 包:这是CGLib的主要实现包,包含了用于创建代理对象的所有类和接口。当无法或者不想使用Java标准的JDK动态代理(只能代理接口实现类)时,CGLib可以生成目标类的子类来实现对目标对象的代理。这个过程...
使用CGlib创建动态代理的一般步骤如下: 1. 引入CGlib的jar包到项目中。 2. 创建一个实现了`MethodInterceptor`接口的类,定义`intercept`方法。 3. 创建`Enhancer`实例,并设置拦截器和目标对象。 4. 调用`...
4. 创建代理对象:最后,通过Enhancer的create()方法,你可以创建出代理对象。这个代理对象在调用目标方法时会自动触发之前设置的回调函数。 CGLib代理的应用场景包括但不限于: - AOP:在不修改源代码的情况下,...
// 使用CGLIB创建代理 Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(ServiceImpl.class); enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object obj, ...