我们先介绍下动态代理:
- 通俗的讲就是代替厂家卖商品,厂家“委托”代理为其销售商品。
介绍下场景:
- 某某工厂生产商品, 代理商从工厂拿去产品,我们从代理商处购买产品,这时候代理商回收百分之二十利润
接下来代码部分:
- 我们先创建接口一个产品应该有的销售与售后
package com.Proxy;
public interface IProducer {
//销售产品
public void saleProduct(float money);
//售后
public void afterService(float money);
}
- 接下来创建具体产品类并且实现上述接口
package com.Proxy;
public class Producer implements IProducer {
//销售
public void saleProduct(float money){
System.out.println("销售产品,并拿到钱"+money);
}
//售后
public void afterService(float money){
System.out.println("提供售后服务,并拿到钱"+money);
}
}
- 最后最关键我们模拟一个消费者,对产品进行消费,并创建代理对象,如下
public class Client {
public static void main(String[] args) {
Producer producer = new Producer();
//创建代理对象:Proxy类中的newProxyInstance方法,被代理类至少实现一个接口
//newProxyInstance中的参数
/**
* ClassLoader : 被代理类对象类加载器(固定写法)
* Class[] :让代理对象和被代理对象有相同的方法
* InvocationHandle : 写让我们如何代理,一般是写一个该接口实现类,通常情况下都是匿名内部类,但是不必须
*/
IProducer proxyProducter = (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 {
//增强代码
//1.获取方法执行参数
Object returnValue = null;
Float money = (float) args[0];
if("saleProduct".equals(method.getName())){
//这里实现方法,收取代理费
returnValue = method.invoke(producer,money*0.8f);
}
return returnValue;
}
});
proxyProducter.saleProduct(100000f);
}
}