您的位置:首页 > 编程语言 > Java开发

java动态代理cglib基于子类代码增强案例

2020-03-29 13:00 288 查看

相对于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实现代理

  • 点赞
  • 收藏
  • 分享
  • 文章举报
qq_44801336 发布了54 篇原创文章 · 获赞 5 · 访问量 744 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: