【问题标题】:Get package names using java reflections使用 java 反射获取包名
【发布时间】:2012-08-24 11:43:52
【问题描述】:

我想从一个单独的 Java 项目中获取所有包名称,我将如何在 Java 中最好使用反射来做到这一点?

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

Package[] pack = Package.getPackages();

编辑:我没有使用 jar 文件,我刚刚导入了项目,因为它将在同一个目录中。我只需要我创建的包,特别是以某个目录开头的包。

【问题讨论】:

  • “我想从一个单独的 Java 项目中获取所有包名,我将如何在 Java 中最好使用反射来做到这一点?”这种恶作剧?您想提供什么应用程序功能

标签: java reflection package


【解决方案1】:

只要你不需要空包,这样的东西应该可以工作:

/**
 * 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 中的包名称以避免重复。

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

Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class);

【讨论】:

    【解决方案2】:

    你真的不能通过使用getPackages() 知道库中的每个包名,因为它只会列出类加载器已知的包名。这意味着如果一个类尚未从特定包中加载,那么它将不存在于列表中。

    使用 zip 文件处理例程打开 jar 文件,并按目录名读出包。使用这种技术,您将发现所有包名,甚至包括那些尚未“使用”的包名。基本上,任何包含.class 文件的路径都是“包名”。

    ---- 已编辑为进一步详细信息表明未使用 JAR 文件 ---

    由于您不使用 JAR 文件(为什么不使用?它们真的很棒!),您将不得不扫描目录。要“找到”目录,您需要切分类路径。类路径的获取方式是:

     String classpath = System.getProperty("java.class.path", null);
    

    然后搜索每个“起点”下的所有目录,其中包含.class 文件。一旦你拥有了所有这些,你就拥有了所有的包。

    同样,仅仅询问类加载器是不可能知道所有包的,除非你能以某种方式保证类加载器已经加载了所有的类(它通常不会)。

    【讨论】:

    • 查看更新,并考虑将您的类打包到 jar 文件中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    相关资源
    最近更新 更多