代理可以理解为中间销售,存在于用户和生产厂家中间,负责两边的联系,厂家的产品通过销售卖给用户,用户所购买的产品出现损坏通过销售来进行售后,用户和厂家不进行直接沟通,降低了方法中的耦合问题
基于借口的代理
Proxy!!!
Proxy所代理的类必须要有一个接口实现
public static void main(String[] args) {
final Producer producer=new Producer();
IProducer iProducer= (IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(), producer.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnValue=null;
Float money= (Float) args[0];
if("saleProduct".equals(method.getName())){
returnValue=method.invoke(producer,money*0.8f);
}
return returnValue;
}
});
iProducer.saleProduct(100000f);
}
newProxyInstance有三个参数
- ClassLoader:类加载器,通过类方法
.getClass().getClassLoader()
获得 - class[]:类中的方法列表,通过
.getClass().getInterfaces()
获得 - InvocationHandler:提供增强代码,一般放入内部内,实现
new InvocationHandler()
,method为执行的方法,args是方法中所需要的参数
基于子类的代理
cglib
需要引入cglib包来使用
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1_3</version>
</dependency>
public static void main(final String[] args) {
final Producer producer=new Producer();
Producer cglibproducer= (Producer) Enhancer.create(producer.getClass(), new MethodInterceptor() {
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
Object returnValue=null;
Float money= (Float) args[0];
if("saleProduct".equals(method.getName())){
returnValue=method.invoke(producer,money*0.8f);
}
return returnValue;
}
});
cglibproducer.saleProduct(100000);
}
Enhancer.create被代理类不能是最终类(最终类是指不能被继承的类,即不能再用最终类派生子类。在Java语言中,如果不希望某类被继承,可以声明这个类为最终类。最终类用关键字final来说明)public final class FinalClass{}
Enhancer.create有两个参数
- class:被代理对象的字节码,通过
.getClass()
获得 - Callback:用于提供增强代码,一般实现
new MethodInterceptor()
基本参数与借口代理类似