[Nashorn] JavaClass(type object) & java.lang.Class

投稿日: 2015/12/05 16:26:08

Java.type()関数はnew演算子に指定できる型オブジェクトを返します。Rhinoのようにパッケージ名付きのクラス名(FQCN)を書いて型オブジェクトを取得することもできます。例えばjava.lang.Stringの型オブジェクトはJava.type("java.lang.String")またはjava.lang.Stringと記述することで取得できます。

一方で、型オブジェクトではなくjava.lang.Classを取得したい場合は、型オブジェクトのclassプロパティにアクセスするか、既存のJavaオブジェクトのgetClass()メソッドを呼び出します。Nashornはjava.lang.Classから型オブジェクトを取得できるように、staticという特別なプロパティを提供しています。

1. 実行するスクリプト(javaClass.js)

function assertEq(f,x) {var r=f();if(r!==x)throw new Error(f.toSource()+", expected=${x}, actual=${r}");}
var JString = Java.type("java.lang.String");
// JavaClass
print(JString);
assertEq(function() JString, java.lang.String);
assertEq(function() Java.type("java.lang.String"), JString);
assertEq(function() "".getClass().static, JString);
assertEq(function() "".getClass().static.class.static, JString);
// java.lang.Class
print("".getClass());
assertEq(function() "".getClass(), java.lang.String.class);
assertEq(function() "".getClass().static.class, java.lang.String.class);

2. jjsで実行する

>jjs -scripting -fullversion javaClass.js
nashorn full version 1.8.0_66-b18
[JavaClass java.lang.String]
class java.lang.String