使用javareflection获取包名称

我想从一个单独的Java项目中获取所有包名称,我最好如何使用reflection在Java中执行此操作?

我已将项目导入到构建路径中,并且我尝试使用下面的代码来获取包名称。

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 findAllPackages() { List classLoadersList = new LinkedList(); 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> classes = reflections.getSubTypesOf(Object.class); Set packageNameSet = new TreeSet(); for (Class classInstance : classes) { packageNameSet.add(classInstance.getPackage().getName()); } return packageNameSet; } 

它找到所有类,循环遍历它们并获取存储在Set中的包名称以避免重复。

不幸的是,我们不能只使用下面的代码和普通的Reflection对象,而不指定允许对象扫描的自定义配置。

 Set> classes = reflections.getSubTypesOf(Object.class);