代理模式
代理设计模式就是将辅助性的操作交给代理类区完成,真正操作交给真实主体类
静态代理
public interface Subject {
/**
* 主体对象要做的事
*/
public void sleepWithfei();
}
package dailims;
public class EmperorA implements Subject{
@Override
public void sleepWithfei() {
System.out.println("皇帝要和妃子睡觉");
}
}
package dailims;
public class WangGong{
private Subject subject;
public WangGong(Subject subject) {
this.subject = subject;
}
public void invoke(){
System.out.println("接妃子");
this.subject.sleepWithfei();
System.out.println("送妃子");
}
}
public class Test {
public static void main(String[] args) {
Subject subject = new EmperorA();
WangGong proxy = new WangGong(subject);
proxy.invoke();
}
}
动态代理
package dailims;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class WangGong implements InvocationHandler{
private Subject subject;
public WangGong(Subject subject) {
this.subject = subject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("接人");
Object resultObject = method.invoke(subject, args);
System.out.println("送人");
return resultObject;
}
}
package dailims;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
//创建真实类主体类对象
Subject subject = new EmperorA();
//创建代理主体类的对象
InvocationHandler handler=new WangGong(subject);
Subject proxySubject=(Subject)Proxy.newProxyInstance(handler.getClass().getClassLoader(), subject.getClass().getInterfaces(),handler);
proxySubject.sleepWithfei();
}
}
总结
- 通过Proxy.newProInstance()取得的对象本质上实现了Subject接口,所以可以将其强制转换成Subject类型,同时又继承了Proxy类。
- 之所以能够调用触发动态代理类的invoke方法,在$Proxy0中执行sleepWith()方法的时候本质上是调用了父类(Proxy)中h对象的invoke方法。
$Proxy0是Proxy.newProInstance()对应的类,是动态生成的,
$Proxy0.class是直接以二进制的方式加载到内存中,并没有对应的class文件,