**java的静态代理(Proxy)**
角色分析: 抽象角色:一般使用接口或者抽象方法来解决
public interface StaticProxy {
void add();
void delete();
void update();
void detail();
}
真实角色:被代理的角色
public class ZhenShiDuiXiang implements StaticProxy {
public void add() {
System.out.println("真实对象add方法");
}
public void delete() {
System.out.println("真实对象delete方法");
}
public void update() {
System.out.println("真实对象update方法");
}
public void detail() {
System.out.println("真实对象detail方法");
}
}
代理角色:代理真实角色
public class DaiLiProxy implements StaticProxy {
private ZhenShiDuiXiang zhenShiDuiXiang;
public DaiLiProxy(ZhenShiDuiXiang zhenShiDuiXiang){
this.zhenShiDuiXiang=zhenShiDuiXiang;
}
public DaiLiProxy() {
}
public void add() {
System.out.println("我是代理add方法");
this.zhenShiDuiXiang.add();
}
public void delete() {
System.out.println("我是代理delete方法");
this.zhenShiDuiXiang.delete();
}
public void update() {
System.out.println("我是代理update方法");
this.zhenShiDuiXiang.update();
}
public void detail() {
System.out.println("我是代理detail方法");
this.zhenShiDuiXiang.detail();
}
}
main测试
public class MyTest {
public static void main(String[] args) {
DaiLiProxy daiLiProxy = new DaiLiProxy(new ZhenShiDuiXiang());
daiLiProxy.add();
daiLiProxy.delete();
daiLiProxy.detail();
daiLiProxy.update();
}
}
控制台打印:
我是代理add方法
真实对象add方法
我是代理delete方法
真实对象delete方法
我是代理detail方法
真实对象detail方法
我是代理update方法
真实对象update方法
动态代理 要记住用Proxy来动态创建代理对象 要继承InvocationHandler接口
重写invoke方法
Object o = Proxy.newProxyInstance(this.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
第一个参数是代理类的加载器,第二个参数是真实对象实现的接口的类加载器,第三个参数是InvocationHandler接口子类。
public class DynamicProxy implements InvocationHandler {
public Object object;
public void getObject(Object object) {
this.object=object;
}
public Object getProxy(Object object){
Object o = Proxy.newProxyInstance(this.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
return o;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
riZhi(method.getName());
Object invoke = method.invoke(object, args);
return invoke;
}
public void riZhi(String string){
System.out.println("执行了"+string+"方法");
}
}