我需要枚举包中的所有类并将它们添加到List中.单个类的非动态版本如下:
List allClasses = new ArrayList();
allClasses.add(String.class);
Run Code Online (Sandbox Code Playgroud)
如何动态地添加包中的所有类及其所有子包?
更新:在阅读了早期答案之后,我试图解决另一个次要问题是绝对正确的,所以让我说明一下.我知道这是可能的,因为其他工具可以做到这一点.在这里查看新问题.
更新:再次阅读本文,我可以看到它是如何被误读的.我想在编译后从文件系统中枚举所有MY PROJECT'S类.
考虑使用s URLClassLoader集合进行参数化,URL这是扩展目录和jar文件的混合.例如:
URL[] urls = new URL[] {
new URL("file:/D:/work/temp/jars/spring-security-core-3.2.0.RELEASE.jar"),
new URL("file:/D:/work/temp/jars/spring-security-config-3.2.0.RELEASE.jar"),
...
new URL("file:/D:/work/temp/domain/bin/"),
new URL("file:/D:/work/temp/web/bin/"),
...
}
URLClassLoader cl = new URLClassLoader(urls);
Run Code Online (Sandbox Code Playgroud)
类加载器正确处理getResources()位于包内某处的资源请求"org/my/package/conf.properties".通过正确处理我的意思是类加载器成功找到目录和jar中的所有匹配项.
传入的特殊空字符串名称getResources("")应该产生所有可用根的URL(在目录和jar中).然而,在ClassLoaders中存在已知的限制,其导致仅返回对应于目录的根.所有根罐子都被丢弃了.
使用classloader.getURLs[]而不是classloader.getResources("")不能与我合作,因为我有一个相互依赖的URLClassLoaders 的复杂图形,所以结果将完全不同.此外,我的类加载器将被第三方类路径扫描设施使用,该设施使用getResources("")调用来设置内部搜索库.这样就无法找到位于罐子里的资源.
我目前有一个工作修复,我扩展URLClassLoader并手动处理带有空字符串的请求,除了返回URLs 的返回集合中的目录之外,还强制执行jar的根.
不过我的问题是:
这种限制的概念/技术原因是什么(不返回罐子的路径)?
通过手动修复,我是否违反任何重要合同?
有没有很好的方法来获得理想的行为?
感谢您的任何想法!