Java静态方法开放为Nashorn JavaScript引擎里的顶级function函数

使用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: 星期六


转载于:https://my.oschina.net/u/1433826/blog/626157

你可能感兴趣的:(Java静态方法开放为Nashorn JavaScript引擎里的顶级function函数)