我想从一个独立的Java项目中获取所有包名,使用Java反射最好,你能怎么做呢?
我已将该项目导入到我的构建路径中,并尝试使用以下代码来获取包名:
Package[] pack = Package.getPackages();
编辑:我没有使用jar文件,我只是将项目导入,因为它将在同一目录中。我只需要我创建的包,特别是以某个目录开头的包。
我想从一个独立的Java项目中获取所有包名,使用Java反射最好,你能怎么做呢?
我已将该项目导入到我的构建路径中,并尝试使用以下代码来获取包名:
Package[] pack = Package.getPackages();
编辑:我没有使用jar文件,我只是将项目导入,因为它将在同一目录中。我只需要我创建的包,特别是以某个目录开头的包。
getPackages()
来了解库中的每个包名称,因为它只会列出类加载器已知的包。这意味着,如果尚未从特定包加载类,则该类将不在列表中。.class
文件的路径都是一个“包名称”。 String classpath = System.getProperty("java.class.path", null);
然后您搜索每个“起始点”下包含.class
文件的所有目录。一旦您拥有了这些,您就拥有了所有的包。
同样,除非您能够保证类加载器已加载所有类(通常情况下不会),否则无法仅通过询问类加载器来知道所有包。
/**
* Finds all package names
* @return Set of package names
*/
public Set<String> findAllPackages() {
List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
classLoadersList.add(ClasspathHelper.contextClassLoader());
classLoadersList.add(ClasspathHelper.staticClassLoader());
Reflections reflections = new Reflections(new ConfigurationBuilder()
.setScanners(new SubTypesScanner(false), new ResourcesScanner())
.setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
.filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("my.base.package"))));
Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class);
Set<String> packageNameSet = new TreeSet<String>();
for (Class classInstance : classes) {
packageNameSet.add(classInstance.getPackage().getName());
}
return packageNameSet;
}
Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class);