原文はこちら。
https://blogs.oracle.com/sundararajan/entry/extracting_a_single_class_file
JavaのFile System APIをNashorn JavaScriptから利用して、Java 9プラットフォームのjimageモジュールファイルから、一つの.classファイルを抽出することができます。
https://blogs.oracle.com/sundararajan/entry/extracting_a_single_class_file
JavaのFile System APIをNashorn JavaScriptから利用して、Java 9プラットフォームのjimageモジュールファイルから、一つの.classファイルを抽出することができます。
FileSystem (Java Platform SE 8)以下のシンプルなNashornスクリプトを使って、指定されたクラス名の.classを抽出します。
https://docs.oracle.com/javase/8/docs/api/java/nio/file/FileSystem.html
Nashorn - OpenJDK Wiki
https://wiki.openjdk.java.net/display/Nashorn/Main
JEP 220: Modular Run-Time Images
http://openjdk.java.net/jeps/220
File: jextract.js
上記スクリプトを使って、以下のように実行してみましょう。一つ目はVector.class、二つ目はScriptObjectMirror.classをファイルに抽出することができます。// This script extracts .class for a single class
// from the platform jimage ($JDK9/lib/modules) file.
// Specify module/class like java.base/java.util.Vector
if (arguments.length == 0) {
print("Usage: jjs jextract -- <module>/<classname>")
exit(1)
}
// Java types used from file system and net API
var FileSystems = Java.type("java.nio.file.FileSystems")
var Files = Java.type("java.nio.file.Files")
var URI = Java.type("java.net.URI")
var name = arguments[0]
var moduleName = name.substring(0, name.indexOf('/'))
var className = name.substring(name.indexOf('/') + 1)
var pathName = "/modules/" + moduleName + "/" +
className.replace(/\./g, '/') + ".class"
// get jrt fs file system instance
var fs = FileSystems.getFileSystem(URI.create("jrt:/"))
// read .class content
var content = Files.readAllBytes(fs.getPath(pathName))
// write to a file in current dir (using default fs)
// simple class name
var simpleName = className.substring(className.lastIndexOf('.') + 1)
Files.write(FileSystems.default.getPath(simpleName + ".class"), content)
$ jjs jextract.js -- java.base/java.util.Vector
$ jjs jextract.js -- jdk.scripting.nashorn/jdk.nashorn.api.scripting.ScriptObjectMirror