1

現在、jdk から jrt-fs.jar (libs フォルダー内) から java.lang.Record などのプレビュー クラス ファイルを抽出しようとしていますが、反復処理時に Record などのプレビュー クラスが見つかりません。これは私が使用しているコードです:

Path jrtFsJar = jdk15Home.resolve("lib").resolve("jrt-fs.jar");
jrtFsJarLoader = new URLClassLoader(new URL[] {jrtFsJar.toUri().toURL()});
FileSystem jrtFs = FileSystems.newFileSystem(
    URI.create("jrt:/"), 
    Collections.emptyMap(), 
    jrtFsJarLoader);
Files.walk(jrtFs.getPath("/modules")).forEach(path -> 
   // Here is walks over classes such as "modules/java.base/java/lang/Object.class"
   // but not over "modules/java.base/java/lang/Record.class"
)

私はまた、より直接的なアプローチを試みました:

FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));
// Object works, I get the bytes.
byte[] object = Files.readAllBytes(jrtFs.getPath("modules", "java.base",
                                          "java/lang/Object.class"));
// Record fails, NoSuchFile.  
byte[] object = Files.readAllBytes(jrtFs.getPath("modules", "java.base",
                                          "java/lang/Record.class"));

--enable-preview を使用してまったく同じ jdk を実行すると、レコードを使用できるようになりました。

jdk linux/lib から Record クラスを抽出するにはどうすればよいですか? プレビュー クラスはその中にありますか、それとも他の場所で探す必要がありますか? それらにアクセスするには特定のフラグが必要ですか?

どんな助けでも大歓迎です。

4

1 に答える 1

3

jrt ファイル システムがすでにある JDK で実行している場合は、別の JDK の jrt ファイル システムに簡単にアクセスできます。

FileSystem jrtFs = FileSystems.newFileSystem(
    URI.create("jrt:/"), Map.of("java.home", jdk15Home.toString()));
byte[] object = Files.readAllBytes(
    jrtFs.getPath("modules", "java.base", "java/lang/Record.class"));

ビルトイン ファイル システムは、この jar のクラスの親ローダーに委任しない、外部 JDK の jrt-fs.jar 用の特別なクラス ローダーを作成します。したがって、再び独自の実装になることはありません。

他の JDK によって提供される実装を使用するため、モジュール ストレージにまったく異なるデータ形式を使用して、新しい機能や JDK を処理することもできます。

于 2021-02-04T11:19:40.670 に答える