-2

我有以下代码行:

InputStreamReader isr = new InputStreamReader(MethodHandles.lookup().lookupClass().getResourceAsStream(csvFile));

有人可以向新手解释一下:

MethodHandles.lookup()
lookupClass()
getResourceasStream()

该代码工作并访问位于 jar 中的 csv 文件。我只是不明白每种方法在做什么

我能够将这条线简化为:

InputStreamReader isr = new InputStreamReader (SQLUtilPROD.class.getResourceAsStream (csvFile));

但仍然很困惑。SQLUtilProd.class 做什么?getResourceAsStream 如何知道从 jar 中获取文件?如果你有多个罐子会发生什么?

不确定,但我认为我们使用 SQLUtil.class 来获取类对象,这反过来又使我们能够访问 getResourceAsStream 用来定位文件的类加载器。

如果这是真的,classLoader 在哪里定义包含 jar 的路径?

4

1 回答 1

1

SQLUtilProd.class 做什么?

每个对象的数据都包含对 java.lang.Class 类对象的引用,该引用由 getClass 方法返回。还有一个描述 java.lang.Class 的 java.lang.Class 对象。请在链接中阅读更多内容。

getResourceAsStream 如何知道从 jar 中获取文件?

getResourceAsStream将在类路径上找到具有给定名称的资源。搜索与给定类关联的资源的规则由该类的定义类加载器实现。请访问链接。

如果你有多个罐子会发生什么?

您可以使用这样的辅助函数获取所有资源:

public static List<InputStream> loadResources(
        final String name, final ClassLoader classLoader) throws IOException {
    final List<InputStream> list = new ArrayList<InputStream>();
    final Enumeration<URL> systemResources = 
            (classLoader == null ? ClassLoader.getSystemClassLoader() : classLoader)
            .getResources(name);
    while (systemResources.hasMoreElements()) {
        list.add(systemResources.nextElement().openStream());
    }
    return list;
}

我相信阅读此链接会对您有所帮助。

classLoader 在哪里定义包含 jar 的路径?

系统 ClassLoader 提供对CLASSPATH中信息的访问。CLASSPATH 可能包含目录和 JAR 文件。因此,您可以访问项目的所有资源以及它们在类路径中的 jar 文件。

于 2018-12-24T21:56:16.893 回答