静态代理
我们以买车为示例把
- 买车功能接口
public interface IBuyCar {
void buyCar();
}
- 用户买车
public class Customer implements IBuyCar{
private int cash;
public int getCash() {
return cash;
}
public void setCash(int cash) {
this.cash = cash;
}
@Override
public void buyCar() {
System.out.println("买车花费了"+cash+"元");
}
}
- 代理商买车
public class BuyCarProxy implements IBuyCar{
private Customer customer;
public BuyCarProxy(Customer customer) {
this.customer = customer;
}
@Override
public void buyCar() {
if(customer.getCash()<100){
System.out.println("钱太少了 买不到");
}else{
customer.buyCar();
}
}
}
- 因客户不能直接买车,只能由代理商买
// 静态执行
Customer c = new Customer();
c.setCash(120);
BuyCarProxy bc = new BuyCarProxy(c);
bc.buyCar();
- 静态代理就是自己要为要代理的类写一个代理类,或者用工具为其生成的代理类,总之,就是程序运行前就已经存在的编译好的代理类,这样有时候会觉得非常麻烦,也导致非常的不灵活
- 动态代理具有更强的灵活性,因为它不用在我们设计实现的时候就指定某一个代理类来代理哪一个被代理对象,我们可以把这种指定延迟到程序运行时由JVM来实现。
动态代理
其他被代理功能和被代理对象不变,动态代理对象改变
public class DynamicProxy implements InvocationHandler{
Object o ;
public DynamicProxy(Object o) {
this.o = o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法执行前");
Object result = method.invoke(o,args);
System.out.println("方法执行后");
return result;
}
}
使用:
Customer customer = new Customer();
customer.setCash(100);
DynamicProxy dynamicProxy = new DynamicProxy(customer);
IBuyCar buyCar = (IBuyCar) Proxy.newProxyInstance(dynamicProxy.getClass().getClassLoader(),customer.getClass().getInterfaces(),dynamicProxy);
buyCar.buyCar();
运行结果
方法执行前
买车花费了100元
方法执行后
网友评论