基于接口的动态代理(jdk动态代理)有一个致命的缺点,就是被代理对象必须要实现一个接口,不然无法实现动态代理。为了解使得一般的对象也能被代理,引出了基于子类的动态代理:
cglib的动态代理
步骤:
- 创建maven工程,导入依赖
<dependencies>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1_3</version>
</dependency>
</dependencies>
- Producer类(一般的被代理类)
package cglib;
/**
* Code by langlang on 2020/3/27
*/
public class Producer {
public void produce() {
System.out.println("生产商品");
}
public void sell(Float money) {
System.out.println("销售赚了"+money);
}
}
- cglib主类
package cglib;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* Code by langlang on 2020/3/27
*/
public class CglibTest {
public static void main(String[] args) {
final Producer producer = new Producer();
Producer producerCglib = (Producer) Enhancer.create(producer.getClass(), new MethodInterceptor() {
/**
* @Description:
*
* @auther: langlang
* @date: 21:44 2020/3/27
* @param: [o, method, objects, methodProxy]
*
* methodProxy是callback的实现类,是当前执行方法的代理对象
* @return: java.lang.Object
*/
Object resultValue = null;
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
if (method.getName() == "sell") {
Float money = (Float) args[0];
Object resultValue = method.invoke(producer, money * 0.8f);
}
return resultValue;
}
});
producerCglib.sell((float) 1000);
}
}