2015-02-23 32 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

相關問題