使用java反射获取包名
我想从一个单独的Java项目中获取所有包名,我应该如何在Java中更好地使用反射来实现这一点 我已经将项目导入到我的构建路径中,并尝试使用下面的代码获取包名使用java反射获取包名,java,reflection,package,Java,Reflection,Package,我想从一个单独的Java项目中获取所有包名,我应该如何在Java中更好地使用反射来实现这一点 我已经将项目导入到我的构建路径中,并尝试使用下面的代码获取包名 Package[]pack=Package.getPackages() 编辑:我没有使用jar文件,我只是导入了项目,因为它将在同一目录中。我只需要我创建的包,特别是以某个目录开头的包。仅使用getPackages()无法知道库中的每个包名,因为它只列出类加载器已知的包名。这意味着,如果一个类尚未从特定的包中加载,那么它将不在列表中 使用z
Package[]pack=Package.getPackages()代码>
编辑:我没有使用jar文件,我只是导入了项目,因为它将在同一目录中。我只需要我创建的包,特别是以某个目录开头的包。仅使用getPackages()
无法知道库中的每个包名,因为它只列出类加载器已知的包名。这意味着,如果一个类尚未从特定的包中加载,那么它将不在列表中
使用zip文件处理例程打开jar文件,并按目录名读取包。使用此技术,您将发现所有包名,甚至是那些尚未“使用”的包名。基本上,任何包含.class
文件的路径都是“包名”
----编辑为进一步的详细信息表明JAR文件未被使用---
既然你没有使用JAR文件(为什么不呢?它们真的很好!),你就必须扫描目录。要“找到”目录,您需要切碎类路径。获取类路径的方法是:
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;
}
/**
*查找所有包名
*@return包名集
*/
公共集findAllPackages(){
List ClassLoaderList=新建LinkedList();
添加(ClasspathHelper.contextClassLoader());
添加(ClasspathHelper.staticClassLoader());
反射反射=新反射(新配置生成器()
.setScanners(新的子扫描程序(false),新的资源扫描程序()
.setURL(ClasspathHelper.forClassLoader(classLoaderList.toArray(新类加载器[0]))
.filterInputsBy(新的FilterBuilder().include(FilterBuilder.prefix(“my.base.package”));
StEnter更新,并考虑将类打包在JAR文件中。“我想从一个单独的java项目中获取所有的包名,java如何最好地使用反射?”最终用户从这些ShanaGigAs中得到什么?您想提供什么应用程序特性?
Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class);