我作为UrlClassLoader的默认子项,通过
添加了我的所有jar文件public void addFile(String path) throws MalformedURLException {
String urlPath = "jar:file:/" + path + "!/";
System.out.println("------------------");
System.out.println("urlPath = " + urlPath);
URL url = new URL(urlPath);
System.out.println("url = " + url);
super.addURL(url);
System.out.println("g = " + getURLs().length);
System.out.println("==================");
}
然后我想从装载机中获取一些类:
System.out.println("cl.loadClass() = " + cl.loadClass("com.company.project.SomeClass"));
它正常返回课程。
当我试图按包找到所有类时:
resources = cl.findResources("com/company/");
返回空枚举。 为什么呢?
答案 0 :(得分:0)
ClassLoader
的Java API没有提供枚举包中所有元素的标准方法。由于您使用自己的ClassLoader
,因此可以在其中实现一个在JAR中执行自定义搜索的函数。
一些链接。
类似的问题: How do I read all classes from a Java package in the classpath?
答案 1 :(得分:0)
我不认为findResources()
做你认为它做的事。根据{{3}}:
返回URL的枚举 代表所有资源 具有的URL搜索路径 指定名称。
这听起来并不像它会进行前缀匹配(如果你考虑一下,在给定HTTP URL的情况下,这是不可能的)。它可能做的是在构建URLClassLoader
的所有基本URL中查找给定的全名,因此如果您调用findResources("log4j.properties")
并且已经构建了类加载器使用5个JAR,其中3个在根目录中包含文件log4j.properties
,然后该方法将返回所有3个。