[Java, JavaScript] Extracting a single .class file from java9 platform jimage modules file

原文はこちら。
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)
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
以下のシンプルなNashornスクリプトを使って、指定されたクラス名の.classを抽出します。

File: jextract.js

// 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)
上記スクリプトを使って、以下のように実行してみましょう。一つ目はVector.class、二つ目はScriptObjectMirror.classをファイルに抽出することができます。
$ jjs jextract.js -- java.base/java.util.Vector
$ jjs jextract.js -- jdk.scripting.nashorn/jdk.nashorn.api.scripting.ScriptObjectMirror

0 件のコメント:

コメントを投稿