专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 一文读懂什么是Java代理模式

一文读懂什么是Java代理模式

更新时间:2022-05-18 10:14:19 来源:赢咖4 浏览400次

什么是Java代理模式?赢咖4小编给大家举几个例子。

静态代理

我们定义一个接口并使用代理模式。我们要做的就是在调用这个Java接口的实现类的时候给这个方法添加函数。

public interface HelloInterface {
    void sayHello();
}

接下来是这个接口的实现类。当我们调用sayhello时,我们输出了一个句子:

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

然后我们设计代理类:

/**
 *Static proxy
 */
public class StaticHelloProxy implements HelloInterface{
    private HelloInterface helloInterface = new Hello();
    @Override
    public void sayHello() {
        System.out.println("say hello before invoke");
        helloInterface.sayHello();
        System.out.println("say hello after invoke");
    }
}

这样,我们就实现了一个静态代理。statichelloproxy 类代理 Hello 类。它还扩展了方法的功能。

动态代理

刚才我们发现静态代理有问题。statichelloproxy代理只能代理hello。如果还有其他类需要代理,我们就需要更多的代理类,这不是我们想要的。那么你可以在同一个班级委派更多班级吗?其实可以通过反射来完成。

public class ProxyHandle implements InvocationHandler {
    private Object object;
    public ProxyHandle(Object object) {
        this.object = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("say hello before invoke" + method.getName());
        method.invoke(object, args);
        System.out.println("say hello after invoke" + method.getName());
        return  null;
    }
}

我们定义了一个proxyhandle,在构造方法中传入需要的对象,通过Java反射调用方法。当然,叫法不同。

public static void main(String[] args) {
        HelloInterface helloInterface = new Hello();
        InvocationHandler handler = new ProxyHandle(helloInterface);
        HelloInterface proxyHello = (HelloInterface) Proxy.newProxyInstance(helloInterface.getClass().getClassLoader(),helloInterface.getClass().getInterfaces(),handler);
        proxyHello.sayHello();
    }

这样就实现了动态代理。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>