- CGLIB动态代理:
- 导包
- 1.使用了Maven管理项目则引入一下坐标即可。
- 2.未使用maven,则可以通过如下方式导包。
- 在完成环境配置之后,进行CGLIB动态代理的实现:
- 1.编写实体类。
- 2.通过cglib动态生成代理类,动态生成的代理类为实体类的子类。
- 3. 客户端从中介买票
- CGLIB实现动态代理的完整代码:
代理模式简介、静态代理、JDK动态代理可以参考以下文章:
JAVA代理模式-静态代理的实现(一)
JAVA代理模式-JDK动态代理的实现(二)
考虑以下场景,你需要去中介手里买电影票,中介会在售票的基础上增强手续费。
则电影院为真实主题类,而中介则为代理类,在真实主题类售卖电影票的基础上,增强功能收取了一定的手续费。
在之前JAVA代理模式-静态代理的实现(一)和 JAVA代理模式-JDK动态代理的实现(二)中,实现代理模式时,首先需要定义一个接口,然后定义实现该接口的实现类,以及获得实现该接口的代理类。
但是如果没有定义接口,只定义了实体类。很显然JDK代理是无法使用了,因为JDK动态代理要求必须定义接口,对接口进行代理。
CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。但是使用CGLIB需要自行进行导包。
导包 1.使用了Maven管理项目则引入一下坐标即可。2.未使用maven,则可以通过如下方式导包。cglib cglib 2.2.2
参考链接:在文章的后半部分,有下载和导入的方式
在完成环境配置之后,进行CGLIB动态代理的实现: 1.编写实体类。class NbCinema{
public void sell(){
System.out.println("售卖火车票!");
}
}
2.通过cglib动态生成代理类,动态生成的代理类为实体类的子类。
class GclibProxyFactory implements MethodInterceptor{
public NbCinema getProxyObject(){
// 创建Enhancer对象,类似于JDK动态代理的Proxy类,下一步就是设置几个参数
Enhancer enhancer = new Enhancer();
// 设置父类的字节码对象,
enhancer.setSuperclass(NbCinema.class);
// 设置回调函数
enhancer.setCallback(this);
// 创建代理对象
NbCinema o = (NbCinema) enhancer.create(); // 生成的代理对象,为NbCinema类的子类
return o;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("收费500");
Object invoke = methodProxy.invokeSuper(o, objects);
return invoke;
}
}
3. 客户端从中介买票
public class CglibProxyTest {
public static void main(String[] args) {
GclibProxyFactory gcp = new GclibProxyFactory();
NbCinema nbc = gcp.getProxyObject();
// 执行sell方法时,会回调函数
// public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
// 进行执行
nbc.sell();
}
}
CGLIB实现动态代理的完整代码:
package com.csdn.proxy.cglibproxy;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
class NbCinema{
public void sell(){
System.out.println("售卖火车票!");
}
}
class GclibProxyFactory implements MethodInterceptor{
public NbCinema getProxyObject(){
// 创建Enhancer对象,类似于JDK动态代理的Proxy类,下一步就是设置几个参数
Enhancer enhancer = new Enhancer();
// 设置父类的字节码对象,
enhancer.setSuperclass(NbCinema.class);
// 设置回调函数
enhancer.setCallback(this);
// 创建代理对象
NbCinema o = (NbCinema) enhancer.create(); // 生成的代理对象,为NbCinema类的子类
return o;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("收费500");
Object invoke = methodProxy.invokeSuper(o, objects);
return invoke;
}
}
public class CglibProxyTest {
public static void main(String[] args) {
GclibProxyFactory gcp = new GclibProxyFactory();
NbCinema nbc = gcp.getProxyObject();
// 执行sell方法时,会回调函数
// public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
// 进行执行
nbc.sell();
}
}



