java中的代理
1:java的静态代理
通常把前面自己实现的代理模式,成为java的静态代理。这种实现方式有一个较大的缺点,就是如果Subject接口发生变化,那么代理类和具体的目标实现都要变化,不是很灵活
2:java的动态代理
通常把使用java内建的对代理模式支持的功能来实现的代理称为java的动态代理。动态代理跟静态代理相比,明显的变化是:静态代理实现的时候,在Subject接口上定义很多的方法,代理类里面自然也要实现很多方法;而动态代理实现的时候,虽然Subject接口上定义了很多方法,但是动态代理类始终只有一个invoke方法。这样当Subject接口发生变化的时候,动态代理的接口就不需要跟着变化了。
java动态代理机制详解
//使用java中的动态代理
public class DynamicProxy implements InvocationHandler {
//被代理的对象
private OrderApi order = null;
//获取绑定好代理和具体目标对象后的目标对象的接口
public OrderApi getProxyInterface(Order order) {
//设置被代理的对象,好方便invoke里面的操作
this.order = order;
//把真正的订单对象和动态代理关联起来
OrderApi orderApi = (OrderApi) Proxy.newProxyInstance(
order.getClass().getClassLoader(),
order.getClass().getInterfaces(),
this
);
return orderApi;
}
public Object invoke(Object proxy, Method method, Ojbect[] args) throws Throwable {
//如果是调用setter方法就需要检查权限
if (method.getName().startWith("set")) {
//如果不是创建人,那就不能修改
if (order.getOrderUser() != null && order.getOrderUser().equals(args[1])) {
//可以操作
return method.invoke(order, args);
} else {
System.out.println("对不起"+args[1]+",你无权修改本订单中的数据");
}
} else {
//不是调用的setter方法就继续运行
return method.invoke(order, args);
}
return null;
}
}