使用Nashorn JavaScript引擎的Java.type()函数,可以把Java的类公开到引擎里使用,如下:
var Calendar=Java.type("java.util.Calendar");
Calendar.getInstance().getTime()
输出结果:
Mon Feb 29 21:18:03 CST 2016
还有:
var File=Java.type("java.io.File");
File.separator
输出结果:
\
同样的,可以Java类里的静态方法公开到引擎里作为顶级function函数来使用,下面代码把String.format()方法公开为引擎里的format()函数,这样,就可以在引擎里使用Java的String类的format静态方法了。
package test.snippet;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class NashornScriptEngineTest {
/**
* 返回一周中的星期名称
*
* @param dayOfWeek 0~6的整数
* @return 返回0~6数值对应的星期名称
*/
public static String format(final int dayOfWeek) {
final String[] weeks = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
if ((dayOfWeek >= 0) && (dayOfWeek < weeks.length)) {
return weeks[dayOfWeek];
}
return null;
}
/**
* 字符串格式化,同{@link java.lang.String#format(String, Object...)}
*
* @param fmt 格式字符串
* @param args 要格式化的参数
* @return 格式化后的字符串
*/
public static String format(final String fmt, final Object... args) {
return String.format(fmt, args);
}
public static void main(final String[] args) {
// Java里调用format()静态方法
System.out.println("formatted in Java:\n" + format("%08d\t\t%010.4f", 789, 321.123));
try {
// 获取JDK 8的Nashorn JavaScript引擎
final ScriptEngineManager engineManager = new ScriptEngineManager();
final ScriptEngine engine = engineManager.getEngineByName("Nashorn");
// 构建format()函数字符串
final String fmtFunc = "var format=Java.type(\"" + NashornScriptEngineTest.class.getName() + "\").format;";
System.out.println("format function: " + fmtFunc);
engine.eval(fmtFunc); // 在Nashorn JavaScript引擎里生成format()函数
// 在引擎里调用format函数
Object result = engine.eval("format(\"%08d\t\t%010.4f\", 789, 321.123)");
System.out.println("formatted in JavaScript:\n" + result);
result = engine.eval("format(5)");
System.out.println("\nother format: " + result);
} catch (final Exception e) {
e.printStackTrace();
}
}
}
输出:
formatted in Java:
00000789 00321.1230
format function: var format=Java.type("test.snippet.NashornScriptEngineTest").format;
formatted in JavaScript:
00000789 00321.1230
other format: 星期六