后端技术Java 杂谈Java后端必备

动态代理系列(三)动态代理换种玩法

2018-09-16  本文已影响0人  关捷

从上一讲动态代理,其实我们可以猜测到,代理类的生成需要接口,那么代理类肯定也是实现那个接口。

到现在为止,我们看到的目标类同样实现了那个接口,但是目标类一定需要实现接口吗?或者说过目标类一定需要吗?

我们举一个例子:

public class ClientObj {
    public static void main(String[] args) {
        TargetObjIntf proxyObj = getProxy(TargetObjIntf.class);
        proxyObj.select();
        proxyObj.http(Arrays.asList("abc"));
    }
    //生成代理类
    private static <T> T getProxy(Class<T> clazz) {
        return (T) Proxy.newProxyInstance(clazz.getClassLoader(),
                new Class[]{clazz}, new ProxyObjHandler());
    }
    interface TargetObjIntf {
        void select();
        void http(List<String> list);
    }
    /**
     * 统一的增强逻辑
     */
    static class ProxyObjHandler implements InvocationHandler {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            if (method.getName().equals("select")) {
                System.out.println("jdbc查数据库返回List");
                return Collections.EMPTY_LIST;
            }
            if (method.getName().equals("http")) {
                System.out.println("HTTP调用返回" + args[0]);
                return Collections.EMPTY_MAP;
            }
            return null;
        }
    }
}

执行结果:

jdbc查数据库返回List
HTTP调用返回[abc]

看到了吗,不需要目标类一样可以使用动态代理。
很多同学可能似曾相识了,没错,这就是Mybatis或者RPC通过接口进行调用的原理,通过中央处理器进行处理,动态代理进行包装。

上一篇下一篇

猜你喜欢

热点阅读