JDK动态代理必须使用接口才能使用,在一些不提供接口的环境中就可以使用CGLIB动态代理,CGLIB动态代理对象是继承自真实对象的子类。
因为CGLIB采用的是第三方技术,需要导包,在pom.xml文件中添加
<dependency>
<groupId>org.sonatype.sisu.inject</groupId>
<artifactId>cglib</artifactId>
<version>2.2.1-v20090111</version>
</dependency>
编写不需要实现接口的被代理类
public class LaoZongImpl{
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("睡觉!");
}
}
代理对象
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class Mishu_No2 implements MethodInterceptor {
/**
* 生成CGLIB代理对象
* @param cls ---Class类(字节码)
* @return Class类的代理对象
*/
public Object getProxy(Class cls){
//CGLIB enhancer增强类对象
Enhancer enhancer = new Enhancer();
//设置增强类型
enhancer.setSuperclass( cls );
//定义代理逻辑对象为当前对象,要求当前对象实现
//MethodInterceptor
enhancer.setCallback( this );
//生成并返回代理对象
return enhancer.create();
}
/**
* 代理逻辑方法
* @param o 代理对象
* @param method 方法
* @param objects 参数
* @param methodProxy 方法代理
* @return 代理逻辑返回
* @throws Throwable
*/
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object result = methodProxy.invokeSuper( o,objects );
return result;
}
}
测试代码
@org.junit.Test
public void test(){
Mishu_No2 mishu_no2 = new Mishu_No2();
LaoZongImpl proxy = (LaoZongImpl) mishu_no2.getProxy( LaoZongImpl.class );
proxy.eat();
}
本文介绍了在Java中,当目标对象没有实现接口时,如何利用CGLIB进行动态代理。CGLIB通过创建目标对象的子类来实现代理,它在实际应用中弥补了JDK动态代理的限制。在项目中,需要引入CGLIB库,并通过示例展示了如何创建和使用CGLIB代理对象。
5万+

被折叠的 条评论
为什么被折叠?



