先来说说代理吧.
举一个生活中常见的例子,我像要租套房子,要求大小15平方,在内环里面,独立卫生间,精装修。一般我们会去找中介,让他去找这样的房子,我只负责给钱就可以,这个中介其实就是这里提到的代理。
那什么又是静态代理和动态代理呢,静态代理是在代码里面就确定了代理类和被代理类是怎么样的关系,而动态代理是在运行时候去确定代理类和被代理类关系,可以说一个代理类可以代理所有其它对象。这样描述有点抽象,可以看一下下面两张图。
静态代理
image.png
动态代理
image.png
下面分别来说说这
静态代理
还是以刚才租房的例子为例,看看如何实现一个静态代理.
RentSubjectImpl.class
public interface RentSubjectImpl {
void rentHouse();
}
StaticProxy.class
public class StaticProxy implements RentSubjectImpl{
private RentSubjectImpl rentSubject;
public StaticProxy(RentSubjectImpl rentSubject) {
this.rentSubject = rentSubject;
}
@Override
public void rentHouse() {
System.out.println("按照要求寻找 要求大小15平方,在内环里面,独立卫生间,精装修");
rentSubject.rentHouse();
}
}
XiaoMing.class
public class XiaoMing implements RentSubjectImpl{
@Override
public void rentHouse() {
System.out.println("交纳房租");
}
}
最终运行test.
public void test(){
RentSubjectImpl rentSubject = new XiaoMing();
StaticProxy staticProxy = new StaticProxy(rentSubject);
}
动态代理
public class ProxyHandler implements InvocationHandler {
private Object target;
public ProxyHandler( Object target )
{
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (target instanceof RentSubjectImpl){
System.out.println("按照要求寻找 要求大小15平方,在内环里面,独立卫生间,精装修");
}
return method.invoke( target, args);
}
}
最终运行类.
public void test(){
XiaoMing xiaoMing = new XiaoMing();
ProxyHandler proxyHandler = new ProxyHandler(xiaoMing);
RentSubjectImpl rentSubject = (RentSubjectImpl) Proxy.newProxyInstance(xiaoMing.getClass().getClassLoader(),xiaoMing.getClass().getInterfaces(),proxyHandler);
rentSubject.rentHouse();
}
最后我们可以看到动态代理其实不光可以代理XiaoMing.class,任何类都可以通过Proxy.newProxyInstance进行代理,最终代理的执行是交给InvocationHandler。(InvocationHandler里面调用invoke方法)
网友评论