JAVA静态代理和动态代理

  1. 代理模式
  2. 静态代理
  3. 动态代理

参考文章:https://www.jianshu.com/p/9bcac608c714

代理模式

为其他对象提供一个代理以控制对某个对象的访问。代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。

代理类为被代理类预处理消息、过滤消息并在此之后将消息转发给被代理类,之后还能进行消息的后置处理。代理类和被代理类通常会存在关联关系(即上面提到的持有的被代理对象的引用),代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。

静态代理

静态代理的模式:首先创建一个接口,然后被代理类实现这个接口,再创建一个代理类,代理类中创建一个被代理类对象的引用,然后代理类中完成被代理类的方法。

有点绕,只要记住一点:代理类主要负责预处理消息、过滤消息、传递消息,所以方法要在代理类中进行加工和调用。

下面来看代码:

1、创建接口

public interface HelloInterface {
    void sayHello();
}

2、创建被代理类实现接口:

public class Hello implements HelloInterface{
    public void sayHello() {
        System.out.println("Hello");
    }
}

3、创建代理类,在该类中,实现被代理类的引用以及方法调用和加工

public class HelloProxy implements HelloInterface{
    private HelloInterface helloInterface = (HelloInterface) new Hello();
    public void sayHello() {
        System.out.println("before invok");
        helloInterface.sayHello();
        System.out.println("after invok");
    }
}

4、通过代理类对象,对目标方法进行调用

public static void main(String[] args) {
        HelloProxy hello = new HelloProxy();
    }

静态代理存在缺点:每个代理类只能为一个类服务,如果要代理的类很多,就需要编写大量的代理类。

例如,再来一个Bye类:

1、接口:

public interface ByeInterface {
    void sayBye();
}

2、接口实现

public class Bye implements ByeInterface{
    public void sayBye() {
        System.out.println("GoodBye!");
    }
}

3、代理类中引用方法

注意,这时候就会发现,原来的那个Hello代理不可以代理这个,必须要新建一个此方法的专属代理

public class ByeProxy implements ByeInterface{
    private ByeInterface byeInterface = (ByeInterface) new Bye();
    public void sayBye(){
        System.out.println("before invok");
        byeInterface.sayBye();
        System.out.println("after invok");
    }
}

4、main方法也要new一个新代理的对象

ByeProxy bye = new ByeProxy();
bye.sayBye();

结果:

动态代理

前两步相同:1、创建接口 , 2、接口实现

3、代理:

public class ProxyHandler implements InvocationHandler{
    private Object object;
    public ProxyHandler(Object object){
        this.object = object;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before invok "+method.getName());
        method.invoke(object,args);
        System.out.println("after invok "+method.getName());
        return null;
    }

}

构建一个handler类来实现InvocationHandler接口

4、main

public static void main(String[] args) {

        HelloInterface hello = new Hello();
        ByeInterface bye = new Bye();

        InvocationHandler handler = new ProxyHandler(hello);
        InvocationHandler handler2 = new ProxyHandler(bye);

        HelloInterface proxyHello = (HelloInterface) Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), handler);
        ByeInterface proxyBye = (ByeInterface) Proxy.newProxyInstance(bye.getClass().getClassLoader(), bye.getClass().getInterfaces(), handler2);

        proxyHello.sayHello();
        proxyBye.sayBye();
    }

结果:

动态代理的代理不需要新建。



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2470290795@qq.com

文章标题:JAVA静态代理和动态代理

文章字数:778

本文作者:runze

发布时间:2020-02-04, 09:35:09

最后更新:2020-02-11, 19:54:12

原始链接:http://yoursite.com/2020/02/04/JVM/JAVA%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏