我怎样才能用番石榴获得给定包裹的所有 class

How can i do to get all class of a given package with guava

我正在开发一个 Maven 项目,我在 pom.xml 文件中添加了番石榴依赖项和其他项目的依赖项。我想获取该项目的给定包的所有 class,我已将其作为依赖项添加到我的 pom 中。 所以我尝试了这个:

public void getClassOfPackage() {

    final ClassLoader loader = Thread.currentThread()
            .getContextClassLoader();
    try {
        for (final ClassPath.ClassInfo info : ClassPath.from(loader)
                .getTopLevelClasses()) {

                System.out.println(info.getSimpleName());

        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public static void main(String[] args) {
    new TestMain().getClassOfPackage();
}

我知道这是错误的,因为它在控制台中给出了:

HierarchicalConfigurationConverter
HierarchicalConfigurationXMLReader
HierarchicalINIConfiguration
SubsetConfiguration
SystemConfiguration...

我不知道在哪里可以指定我正在谈论的项目以及我如何才能传递包名称,它给了我它包含的所有 class。

这就是您看到它被打印出来的原因 sun.misc.Launcher$AppClassLoader:

} else {
     System.out.println(loader.getClass().getName());
}

你的 class 路径上不在你的包中的每个 class 都会导致你的程序打印出 ClassLoader 实现 class 的名称,这你可能不想要。

此外,虽然 info.getName().startsWith("org.mypackage") 应该有效,但最好写成 info.getPackageName().equals("org.mypackage")(或者 startsWith,如果你也想包含子包)。

我可以显示所有 类 都在同一个项目中,但对于另一个项目作为依赖项添加到 pom.xml 中还没有:

我们在同一个项目中的解决方案:

 public void getClassOfPackage() {

    final ClassLoader loader = Thread.currentThread()
            .getContextClassLoader();
    try {

        ClassPath classpath = ClassPath.from(loader); // scans the class path used by classloader
        for (ClassPath.ClassInfo classInfo : classpath.getTopLevelClasses("org.mypackage")) {
          System.out.println(classInfo.getSimpleName()+" <==> "+classInfo.getPackageName());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public static void main(String[] args) {
    new TestMain().getClassOfPackage();
}

Google reflections的帮助下更容易解决这个问题。

请检查以下 question 以获得正确答案 - 请注意,已检查的答案没有提供有效的解决方案,第二个 (Aleksander Blomskøld) 可以!

我找到了两个解决方案:

用番石榴:

public void getClassOfPackage(String packagenom) {

    final ClassLoader loader = Thread.currentThread()
            .getContextClassLoader();
    try {

        ClassPath classpath = ClassPath.from(loader); // scans the class path used by classloader
        for (ClassPath.ClassInfo classInfo : classpath.getTopLevelClasses(packagenom)) {
         if(!classInfo.getSimpleName().endsWith("_")){
            System.out.println(classInfo.getSimpleName());
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public static void main(String[] args) {
    new TestMain().getClassOfPackage("org.myproject");
}

与Java.util:

    public List<Class> getClassOfPackage(String packageName)
        throws ClassNotFoundException, IOException {

    ClassLoader classLoader = Thread.currentThread()
            .getContextClassLoader();

    assert classLoader != null;
    String path = packageName.replace('.', '/');
    Enumeration<URL> resources = classLoader.getResources(path);
    List<File> dirs = new ArrayList<File>();
    while (resources.hasMoreElements()) {
        URL resource = resources.nextElement();
        dirs.add(new File(resource.getFile()));
    }
    ArrayList<Class> classes = new ArrayList<Class>();
    for (File directory : dirs) {
        classes.addAll(findClasses(directory, packageName));
    }
    return classes;
}

private static List<Class> findClasses(File directory, String packageName)
        throws ClassNotFoundException {
    List<Class> classes = new ArrayList<Class>();
    if (!directory.exists()) {
        return classes;
    }
    File[] files = directory.listFiles();
    for (File file : files) {
        if (file.isDirectory()) {
            assert !file.getName().contains(".");
            classes.addAll(findClasses(file,
                    packageName + "." + file.getName()));
        } else if (file.getName().endsWith(".class")) {
            classes.add(Class.forName(packageName
                    + '.'
                    + file.getName().substring(0,
                            file.getName().length() - 6)));
        }
    }
    return classes;
}

public static void main(String[] args) throws ClassNotFoundException,
        IOException {

    for (Class className : new ClassOfPackage()
            .getClassOfPackage("org.mypackage")) {
        if (!className.getSimpleName().endsWith("_")) {
            System.out.println(className.getSimpleName());
        }

    }

}