相对于Proxy不同的是,Proxy是基于接口的动态代理,而cglib是子类的
第一步导入cglib的jar包
<dependencies>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.12</version>
</dependency>
</dependencies>
普通类
public class Producer {
/**
* 销售
* @param money
*/
public void saleProduct(float money) {
System.out.println("销售产品:并拿到钱"+money);
}
/**
* 售后
* @param money
*/
public void afterService(float money){
System.out.println("提供售后,并拿到钱"+money);
}
}
测试类
/**
* 模拟一个消费者
* @author DELL
*/
public class Client {
public static void main(String[] args) {
final Producer producer = new Producer();
// producer.saleProduct(10000f);
/**
* 基于子类的动态代理
* 基于子类的动态代理:
* 涉及的类: Enhancer
* 提供者:第三方cglib库
* 创建代理对象: 使用Enhancer类中的create方法
* 创建代理对象的要求:
* 被代理类不能是最终类
*
* class 字节码
* 它是用于指定被代理对象的字节码
*
* Callback用于增强的代码
*/
Producer cglibProduce = (Producer)Enhancer.create(producer.getClass(), new MethodInterceptor() {
/**
* 执行该方法的任何方法都会经过该方法
* @param o
* @param method
* @param objects
* @param methodProxy 当前执行方法的代理对象
*
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//提 供增强的代码
Object returnValue = null;
//1.获取方法执行的参数
Float money = (Float)objects[0];
if("saleProduct".equals(method.getName())){
returnValue = method.invoke(producer, money*0.8f);
}
return returnValue;
}
});
cglibProduce.saleProduct(10000f);
}
}
可用看出拦截方法之后和Proxy的处理大同小异
Proxy实现代理
来源:CSDN
作者:qq_44801336
链接:https://blog.csdn.net/qq_44801336/article/details/104751150