2015-02-23 34 views
1

正如描述所说:如何获得给定包名的所有Java类文件的列表。如何获取Java中特定包中的所有Class文件?

+0

这不是问题。也许你应该将问题编辑为适当的问题,并将答案作为答案发布。 – Eran 2015-02-23 16:11:00

+1

我知道。我在问答功能方面遇到了一些麻烦。我只想分享这段代码片段,因为这个社区帮助我解决了这个问题...... – mythbu 2015-02-23 16:12:53

回答

3

我在这里看到了很多关于SO和其他站点的问题和方法,以查找特定Java包中的所有类。大多数解决方案都不适合我。有时他们使用Jar文件,但不使用文件夹中的“普通”Java项目(比如IDE的方式)或其他方式。因此,我将所有这些代码片段放在一起,形成了一个解决方案,无论代码是在Jar文件中还是在普通文件夹结构中,它都可以用于我(开箱即用)。

这非常简单:您给方法getClassesInPackage要检查的包的名称,您将获得此包中所有类的列表。目前没有任何例外是有规律的“消费”。

玩得开心!以下是代码:

public static final List<Class<?>> getClassesInPackage(String packageName) { 
    String path = packageName.replaceAll("\\.", File.separator); 
    List<Class<?>> classes = new ArrayList<>(); 
    String[] classPathEntries = System.getProperty("java.class.path").split(
      System.getProperty("path.separator") 
    ); 

    String name; 
    for (String classpathEntry : classPathEntries) { 
     if (classpathEntry.endsWith(".jar")) { 
      File jar = new File(classpathEntry); 
      try { 
       JarInputStream is = new JarInputStream(new FileInputStream(jar)); 
       JarEntry entry; 
       while((entry = is.getNextJarEntry()) != null) { 
        name = entry.getName(); 
        if (name.endsWith(".class")) { 
         if (name.contains(path) && name.endsWith(".class")) { 
          String classPath = name.substring(0, entry.getName().length() - 6); 
          classPath = classPath.replaceAll("[\\|/]", "."); 
          classes.add(Class.forName(classPath)); 
         } 
        } 
       } 
      } catch (Exception ex) { 
       // Silence is gold 
      } 
     } else { 
      try { 
       File base = new File(classpathEntry + File.separatorChar + path); 
       for (File file : base.listFiles()) { 
        name = file.getName(); 
        if (name.endsWith(".class")) { 
         name = name.substring(0, name.length() - 6); 
         classes.add(Class.forName(packageName + "." + name)); 
        } 
       } 
      } catch (Exception ex) { 
       // Silence is gold 
      } 
     } 
    } 

    return classes; 
} 
+1

为什么口袋妖怪例外? – JacksOnF1re 2015-02-23 16:13:30

+0

引发异常的地方应根据代码的用途插入自己的代码。仅仅在一个实例化错误上退出整个探索可能并不总是足够的。可以输出一个调试消息或做其他有用的东西。 – mythbu 2015-02-25 10:01:12

相关问题