public class Client {
public static void main(String[] args) {
final Producer producer = new Producer();
/**
* 动态代理:
* 特点:字节码文件随用随创建,随用加载
* 作用:不修改源码的基础上对方法加强
* 分类:
* 基于接口的动态代理
* 基于子类的动态代理
* 基于接口的动态代理:
* 涉及的类:Enhancer
* 提供者:第三方cglib
* 如何创建代理对象:
* 使用Enhancer类中的create方法
* 创建代理对象的要求:
* 被代理类不能是最终类
* newProxyInstance方法的参数:
* Class:字节码
* 它是用于指定被代理对象的字节码
* InvocationHandler
* 它是让我们写如何代理。我们一般都是一些该接口的实现类,通常情况下
* 都是匿名内部类,但不是必须的
*
* 此接口的实现类都是谁用谁写
* 我们一般写的都是该接口的子接口实现类:MethodInterceptor(方法拦截) */
Producer cglibProducer = (Producer) Enhancer.create(producer.getClass(),
new MethodInterceptor() {
/**
* 执行被代理对象的任何方法都会经该方法
* @param proxy 代理对象的引用
* @param method 当前代理对象可以执行的方法
* @param args 当前执行方法所需的参数
* 以上三个参数和基于接口的动态代理中invoke方法的参数一样的
* @param methodProxy:当前执行方法的代理对象
* @return
* @throws Throwable
*/
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
//提供增强的方法
Object object = new Object();
//1.获取方法执行的参数
Float money = (Float) args[0];
//2.判断当前方法是不是销售
if("saleProduct".equals(method.getName())){
object= method.invoke(producer,money*0.8f);
}
return object;
}
});
cglibProducer.saleProduct(10000f);
}
}
Spring动态代理之基于子类的动态代理
最新推荐文章于 2021-02-14 14:28:21 发布