首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 遍歷 JDK 核心包 (如 java.io) 下所有 Class:掃描 rt.jar 實現

     編輯:程式設計綜合問答

需枚舉 `java.io` 包下所有類/接口,核心思路:定位 JRE 安裝路徑 → 讀取 `jre/lib/rt.jar` (JDK 8) 或 `jmods/java.base.jmod` (JDK 9+) → 過濾包前綴。

JDK 8 實現 (rt.jar)

public static Set<String> listClassesInJavaIo() throws IOException {
    String javaHome = System.getProperty("java.home"); // .../jre
    Path rtJar = Paths.get(javaHome, "lib", "rt.jar");
    Set<String> classes = new HashSet<>();
    
    try (JarFile jar = new JarFile(rtJar.toFile())) {
        jar.stream()
           .filter(je -> !je.isDirectory())
           .map(je -> je.getName().replace('/', '.'))
           .filter(name -> name.startsWith("java.io.") && name.endsWith(".class"))
           .map(name -> name.substring(0, name.length() - 6)) // 去 .class
           .forEach(classes::add);
    }
    return classes;
}

JDK 9+ (模塊化,jmod 文件)

  • `rt.jar` 不復存在,核心類在 `/jmods/java.base.jmod` (壓縮格式)。
  • 可用 jmod list java.base.jmod 命令行工具,或解析 JMOD 格式(較複雜)。
  • 簡化:ClassLoader.getSystemResources("java/io/") 只能獲取資源文件,無法枚舉類。

通用替代方案:Reflections 庫

<dependency>
  <groupId>org.reflections</groupId>
  <artifactId>reflections</artifactId>
  <version>0.10.2</version>
</dependency>

Reflections reflections = new Reflections("java.io");
Set<Class<?>> classes = reflections.getSubTypesOf(Object.class); // 包含接口

注意:模塊化後需 `--add-opens java.base/java.io=ALL-UNNAMED` 才能反射訪問非導出包。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved