假设您有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
...

10-04 11:37