昨晚看了一下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截图中也不难看出。
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();
}
}