欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java代理 静态代理 动态代理 详解

程序员文章站 2022-06-17 19:59:29
...

Java代理:静态代理和动态代理

静态代理

代理对象持有目标对象的句柄

所有调用目标对象的方法,都调用代理对象的方法

对每个方法,需要静态编码(理解简单,但代码繁琐)

–见StaticProxy.java

interface Subject{
   default void request(){
       System.out.println("default ");
   }
}
class Entity implements Subject{
    public void request(){
        System.out.println("dealing the request");
    }
}
public class StaticProxy implements Subject{//与目标对象实现相同接口
    private Subject subject;//静态代理拥有实际目标对象的句柄,这里用超类表示
    public StaticProxy(Subject subject){
        this.subject=subject;
    }
    public void request(){//静态代理可以对代理服务做相应处理
        System.out.println("------------before-----------");
        subject.request();
        System.out.println("------------after-------------");
    }

    public static void main(String[] args) {
        Entity e1=new Entity();
        StaticProxy sp=new StaticProxy(e1);
        sp.request();
    }
}

输出结果:

java代理 静态代理 动态代理 详解

 

动态代理

对目标对象的方法每次被调用,进行动态拦截

java代理 静态代理 动态代理 详解

 

动态代理的实现

代理处理器

持有目标对象的句柄

实现InvocationHandler接口

实现invoke方法

所有的代理对象方法调用,都会转发到invoke方法来

invoke的形参method,就是指代理对象方法的调用

在invoke内部,可以根据method,使用目标对象不同的方法来响应请求

 见ProxyHandler.java

interface Subject{
    public void request();
}
class SubjectImpl implements Subject{
    @Override
    public void request() {
        System.out.println("dealing the request");
    }
}
public class ProxyHandler implements InvocationHandler {
    private Subject subject;
    public ProxyHandler(Subject subject){
        this.subject=subject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//实现invoke()方法
        System.out.println(proxy.getClass().getName());//打印代理对象的名字
        System.out.println("-------------before-----------");
        Object result=method.invoke(subject,args);
        System.out.println("-------------after-------------");

        return result;
    }

    public static void main(String[] args) {
        SubjectImpl realSubject=new SubjectImpl();
        ProxyHandler handler=new ProxyHandler(realSubject);
        //利用反射动态加载代理对象
        Subject proxySubject=
                (Subject) Proxy.newProxyInstance(SubjectImpl.class.getClassLoader(),SubjectImpl.class.getInterfaces(),handler);

        proxySubject.request();
    }
}

输出结果:

java代理 静态代理 动态代理 详解

 

注:转载需注明出处。