public class Client {
public static void main(String[] args) {
final Producer producer = new Producer();
/**
* 动态代理:
* 特点:字节码文件随用随创建,随用加载
* 作用:不修改源码的基础上对方法加强
* 分类:
* 基于接口的动态代理
* 基于子类的动态代理
* 基于接口的动态代理:
* 涉及的类:Proxy
* 提供者:JDK官方
* 如何创建代理对象:
* 使用Proxy类中的newProxyInstance方法
* 创建代理对象的要求:
* 被代理类最少实现一个接口,如果没有则不能使用
* newProxyInstance方法的参数:
* ClassLoader:类加载器
* 它是用于加载代理对象字节码的。写的是被代理对象的类加载器。固定写法
* Class[]:字节码数组
* 他是用于让代理对象和被代理对象有相同的方法。也是固定写法
* InvocationHandler
* 它是让我们写如何代理。我们一般都是一些该接口的实现类,通常情况下都是
* 匿名内部类,但不是必须的
* 此接口的实现类都是谁用谁写
*
* 细节:当没有接口是就不能使用这个基于接口的动态代理
*/
/**
* 动态代理对象创建成功
*/
Iproducer proxyProducer =(Iproducer) Proxy.newProxyInstance(producer.getClass().
getClassLoader(),producer.getClass().getInterfaces(),
new InvocationHandler() {
/**
*作用:执行被代理对象的任何接口方法都会经过该方法
* @param proxy 代理对象的引用
* @param method 当前代理对象可以执行的方法
* @param args 当前执行方法所需的参数
* @return 和被代理对象有相同的返回参数
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) 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;
}
});
//消费者提供10000元,销售要拿20%,如何做呢?上面就是这个作用
proxyProducer.saleProduct(10000f);
}
}
Spring动态代理详解之基于接口的动态代理
最新推荐文章于 2022-08-02 14:24:41 发布