Resources 使用前导斜杠从类加载器获取资源

Resources 使用前导斜杠从类加载器获取资源,resources,classloader,Resources,Classloader,我试图通过反射访问第三方jar的外部方法 1) 我通过系统类加载器的“addUrl”方法将外部jar添加到类路径中 2) 我检索类类型和方法,然后调用该方法,它就可以正常工作了 我反编译外部jar的一部分: public class Deploy { ... public static Deploy init() { InputStream i = Deploy.class .getClassLoader() .getRe

我试图通过反射访问第三方jar的外部方法

1) 我通过系统类加载器的“addUrl”方法将外部jar添加到类路径中

2) 我检索类类型和方法,然后调用该方法,它就可以正常工作了

我反编译外部jar的一部分:

public class Deploy
{
    ...

    public static Deploy init()
    {
        InputStream i = Deploy.class
        .getClassLoader()
        .getResourceAsStream(
        "/com/example/props");
    }
}
使用第三部分组件,这个调用可以工作,因为它可以正确读取“props”文件。 但在我的代码中,它返回null,intead of: “/com/example/props” 我试过: “com/example/props” 没有斜线,它就可以工作

如何使代码在我的应用程序中工作?有解决办法吗?(我不得不通过反思来称呼它)

谢谢

  • 如果您假设JVM类加载器是URLClassLoader,那么请注意JDK不能保证这一点,而且在Java9()中可能不是这样

  • URLClassLoader.getResourceAsStream不应传递前导“/”,因此这可能是第三方JAR中的错误。您最好的选择是将第三方JAR加载到自定义类加载器(例如,您自己的URLClassLoader子类)中,该加载器可以处理前导“/”(例如,重写getResourceAsStream,删除“/”,并委托给URLClassLoader)


  • 的确,
    URLClassLoader.getResource
    在JavaSE中不应该有一个前导的
    /
    ,但是我发现一个前导的
    /
    在JavaEE中起作用。但我不知道为什么。也许是实现中的一个bug,也许只是对基于目录的类路径比较宽容。即使它可以工作,我也不会依赖于它,因为即使对类加载器资源没有具体的要求,也有一些已经建立的约定。我检查了Tomcat的源代码,发现它在其
    WebappClassLoader
    中覆盖了JDK的
    classloader
    逻辑。