在上一篇博客中写了基于接口的动态代理,其实这两个原理基本差不多,对比学习更好理解。
基于子类的动态代理:
涉及的类:Enhancer
提供者:第三方库cglib库
如何创建代理对象:使用Enhancer类中的create方法
创建代理对象的要求:代理类不是最终类
1.导入依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.7</version>
</dependency>
</dependencies>
2.Producer类
//生产者
public class Producer{
//销售
public void saleProduce(float money){
System.out.println("销售商品,并拿到钱"+money);
}
//售后
public void afterService(float money){
System.out.println("提供售后服务,并拿到钱"+money);
}
}
3.调用处理程序类MyMethodInterceptor
public class MyMethodInterceptor implements MethodInterceptor {
private Object target;
public MyMethodInterceptor(Object target) {
this.target = target;
}
public Object intercept(Object o, Method method,
Object[] args, MethodProxy methodProxy) throws Throwable {
Object result = null;
//获取方法执行的参数
Float money = (Float)args[0];
//判断当前方法是不是销售
if("saleProduce".equals(method.getName())){
result = method.invoke(target, money*0.8f);
}
return result;
}
}
4.测试类Client
public class Client {
public static void main(String[] args) {
//被代理对象
Producer producer = new Producer();
//获取代理对象
Producer proxy =(Producer) Enhancer.create(
producer.getClass(),
new MyMethodInterceptor(producer));
//使用代理对象调用被代理对象中的方法
proxy.saleProduce(10000f);
}
}