第一个Nashorn实例(Java8)

5 篇文章 0 订阅

之前学习Java8的时候恰好写了个简单的例子,所以放在这里记录一下。文件目录:StringFunction.java,字符串功能类StringNashorn.java,封装脚本引擎NashornTest.java,测试引擎,引擎调用
StringFunction.java源码:

public class StringFunction {
    
    /**
     * 字符串截取
     */
    public String sub(String str, int start, int end) {
        return str.substring(start, end);
    }
    
    /**
     * 字符串拼接
     */
    public String append(String... strs) {
        StringBuilder result = new StringBuilder(strs[0]);
        Stream.of(strs).skip(1).forEach(str -> result.append(str));
        return result.toString();
    }
}
StringNashorn.java源码:
public class StringNashorn {
    
    /**
     * Nashorn脚本引擎
     */
    private ScriptEngine nashorn = new ScriptEngineManager().getEngineByName("nashorn");
    
    /**
     * 执行脚本
     */
    public Object execute(String script) {
        ScriptContext scriptContext = new SimpleScriptContext();
        // 定义一个名为stringfunction的函数,这个函数实际对应着一个StringFunction对象
        scriptContext.setAttribute("stringfunction", new StringFunction(), 100);
        nashorn.setContext(scriptContext);
        
        Object result = null;
        try {
            result = nashorn.eval(script);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
        
        return result;
    }
}
NashornTest.java源码:
public class NashornTest {
    
    public static void main(String[] args) {
        String substring = "stringfunction.sub(\"abcdefghijk\", 1, 4);";
        String append = "stringfunction.append(\"abc\", \"def\");";
        
        StringNashorn nashorn = new StringNashorn();
        Object subResult = nashorn.execute(substring);
        Object appendResult = nashorn.execute(append);
        System.out.println(subResult.toString());
        System.out.println(appendResult.toString());
    }
}
运行main方法,运行结果:
bcd
abcdef
这里如果 NashornTest.java改写如下:
public class NashornTest {
    
    public static void main(String[] args) {
        // 脚本内用对象接收结果并打印
        String substring = "var s1 = stringfunction.sub(\"abcdefghijk\", 1, 4);"
                + " print(s1);";
        String append = "var s2 = stringfunction.append(\"abc\", \"def\");"
                + " print(s2);";
        
        StringNashorn nashorn = new StringNashorn();
        // 这里execute不再返回对象,因为在脚本里面已经有对象接收sub和append的执行结果。
        nashorn.execute(substring);
        nashorn.execute(append);
    }
}
同样也会输出相同的结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值