重新认识匿名内部类,构造过滤器链

        昨晚看了一下dubbo过滤器链的创建,对java基础的匿名内部类做了一部分了解,也算是巩固了一下基础吧,基础确实很重要。

       

//dubbo ProtocolFilterWrapper 构建过滤器链
private static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) {
        Invoker<T> last = invoker;
        List<Filter> filters = 
        ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);
        if (!filters.isEmpty()) {
            for (int i = filters.size() - 1; i >= 0; i--) {
                final Filter filter = filters.get(i);
                final Invoker<T> next = last;
                last = new Invoker<T>() {

                    @Override
                    public Class<T> getInterface() {
                        return invoker.getInterface();
                    }

                    @Override
                    public URL getUrl() {
                        return invoker.getUrl();
                    }

                    @Override
                    public boolean isAvailable() {
                        return invoker.isAvailable();
                    }

                    @Override
                    public Result invoke(Invocation invocation) throws RpcException {
                        return filter.invoke(next, invocation);
                    }

                    @Override
                    public void destroy() {
                        invoker.destroy();
                    }

                    @Override
                    public String toString() {
                        return invoker.toString();
                    }
                };
            }
        }
        return last;
    }

        dubbo ProtocolFilterWrapper通过匿名内部类的方式,创建了一条过滤链。编译这个java文件后,生成了一个ProtocolFilterWrapper$1.class,反编译下此文件。实际上java新建了一个ProtocolFilterWrapper$1类,持有了invoker、filter、next三个成员变量。debug截图中也不难看出。

7b25cacc627c343991961504c4badd69f45.jpg

final class ProtocolFilterWrapper$1 implements Invoker<T> {
    ProtocolFilterWrapper$1(Invoker var1, Filter var2, Invoker var3) {
        this.val$invoker = var1;
        this.val$filter = var2;
        this.val$next = var3;
    }

    public Class<T> getInterface() {
        return this.val$invoker.getInterface();
    }

    public URL getUrl() {
        return this.val$invoker.getUrl();
    }

    public boolean isAvailable() {
        return this.val$invoker.isAvailable();
    }

    public Result invoke(Invocation invocation) throws RpcException {
        return this.val$filter.invoke(this.val$next, invocation);
    }

    public void destroy() {
        this.val$invoker.destroy();
    }

    public String toString() {
        return this.val$invoker.toString();
    }
}

 

转载于:https://my.oschina.net/chae/blog/1836519

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值