1、基于接口的动态代理(Proxy)
必须提供一个接口:
public interface Iproducer {
public void saleProduct(float money);
}
提供被代理对象,被代理对象要实现上面这个接口
public class Producer implements Iproducer{
@Override
public void saleProduct(float money){
System.out.println("销售,钱:"+money);
}
}
动态代理:
public class Client {
public static void main(String[] args) {
Producer producer = new Producer();
/**
* 基于接口的动态代理
* 设计的类:Proxy
* 官方提供
* 第一个参数ClassLoader:传入被代理对象的类加载器
* 第二个参数:传入被代理对象的接口
* 第三个参数:如何代理,(InvocationHandler)一般写个接口实现类,也可以写匿名内部类
*
*/
//创建代理对象
//此处一定要强转为接口类型,不能是Producer类型,因为代理对象是接口的实现类对象,而Producer是接口实现类的一种
Iproducer proxyProducer = (Iproducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(),
producer.getClass().getInterfaces(),
new InvocationHandler() {
@Override
//和代理对象有相同的返回值
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();
Object value=null;
if(methodName.equalsIgnoreCase("saleproduct")){
float money =(float) args[0]+100;
value = method.invoke(producer, money);
}
return value;
}
});
proxyProducer.saleProduct(1000);
}
}
2、基于子类的动态代理(cglib)
提供被代理对象
public class Producer{
public void saleProduct(float money){
System.out.println("销售,钱:"+money);
}
}
动态代理:
public class Client {
public static void main(String[] args) {
Producer producer = new Producer();
/**
* 基于子类的动态代理
* 设计的类:Enhancer
* 第三方cglib库
* 使用Enhancer的create创建代理对象
* 参数:
* 1、Class:被代理对象的字节码
* 2、Callback:提供增强 一般写其子接口的实现类:MethodInterceptor
* 要求:被代理类不能是最终类
*/
Producer proxy_producer = (Producer)Enhancer.create(producer.getClass(), new MethodInterceptor() {
@Override
//MethodProxy methodProxy表示执行方法的代理对象,即proxy_producer
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
String methodName = method.getName();
Object value = null;
if(methodName.equalsIgnoreCase("saleProduct")){
float money = (float)objects[0]+100;
value = method.invoke(producer, money);
}
return value;
}
});
proxy_producer.saleProduct(1000);
}
}