假设您有moduleA和moduleB。 ModuleA定义一个接口(interface)(例如,用于服务),而ModuleB具有实现该接口(interface)(提供服务)的具体类。
现在,如果接口(interface)具有默认方法,并且您在模块B中的类上(从另一个模块)调用了该方法,那么是否应在模块A或模块B内执行此调用?
显然是从moduleA来的...原理是什么?
示例:假设您有执行此操作的代码:
InputStream is = this.getClass().getResourceAsStream(fullPath);
如果此代码位于moduleB中服务的实现中,则将打开流。但是,如果代码位于moduleA的默认方法中,则在moduleB上调用该服务时,您将需要在moduleB中拥有一个“开放”资源(因此,调用似乎认为它是来自“外部” moduleB)。
想了解原因。
谢谢
用一个例子来编辑我的问题。
假设您在moduleA中有以下代码:
public interface PropertiesProvider {
public default Properties get(String domain) {
Class clazz =this.getClass();
System.out.println(" CLASS " +clazz);
InputStream is = clazz.getResourceAsStream(domain) ;
if (is != null) {
Properties props = new Properties();
try {
props.load(is);
return props;
} catch (IOException e) {
//log
}
}
return null;
}
}
并在moduleB中
public class PropertiesProviderImpl implements PropertiesProvider {}
如果您从ModuleA调用该服务,则该调用被跟踪为来自类PropertiesProviderImpl的查找资源,但是如果未“打开”该资源,则不会加载该资源
如果将代码复制到PropertiesProviderImpl中,则调用将追溯到该类,找到该资源并将其加载,即使未“打开”该资源
所以我的问题是:为什么通话后的区别来自同一类?
(区别在于,在一种情况下,该方法是某种类型的方法,是从接口(interface)中的默认方法继承而来的)
最佳答案
查看getResourceAsStream If this class is in a named Module then this method will attempt to find the resource in the module.
的文档
在第一种情况下,您的代码(在moduleA
中)看到Type
,但是看不到实现Type
的类,因为它在moduleB
中。在第二种情况下,您的代码可以看到“实现” Type
的类。
看一下引用波纹管,最重要的句子是:
[...]
[长回答] :reflective-readability
String providerName
= System.getProperty("javax.xml.stream.XMLInputFactory");
if (providerName != null) {
Class providerClass = Class.forName(providerName, false,
Thread.getContextClassLoader());
Object ob = providerClass.newInstance();
return (XMLInputFactory)ob;
}
// Otherwise use ServiceLoader
...