scriptengine js调用java_ScriptEngineManager类(Java和JS互相调用)

importjava.io.File;importjava.util.ArrayList;importjava.util.List;importjavax.script.Bindings;importjavax.script.Invocable;importjavax.script.ScriptContext;importjavax.script.ScriptEngine;importjavax.script.ScriptEngineManager;importjavax.script.SimpleScriptContext;importorg.junit.Test;public classJavaScriptFunction {

@Testpublic void print() throwsException{

ScriptEngineManager manager= newScriptEngineManager();

ScriptEngine engine= manager.getEngineByName("JavaScript");

engine.eval("print('hello word!!')");

}

@Testpublic void obj() throwsException {

ScriptEngineManager manager= newScriptEngineManager();

ScriptEngine engine= manager.getEngineByName("JavaScript");

StringBuffer script= newStringBuffer();

script.append("var obj = new Object();");

script.append("obj.hello = function(name){print('hello, '+name);}");//执行这段script脚本

engine.eval(script.toString());//javax.script.Invocable 是一个可选的接口//检查你的script engine 接口是否已实现!//注意:JavaScript engine实现了Invocable接口

Invocable inv =(Invocable) engine;//获取我们想调用那个方法所属的js对象

Object obj = engine.get("obj");//执行obj对象的名为hello的方法

inv.invokeMethod(obj, "hello", "Script Method !!");

}

@Testpublic void file() throwsException{

ScriptEngineManager manager= newScriptEngineManager();

ScriptEngine engine= manager.getEngineByName("JavaScript");

engine.eval(new java.io.FileReader(new File("F:/test/test.js")));

Invocable inv=(Invocable) engine;

Object obj= engine.get("obj");

inv.invokeMethod(obj,"name", "知道了");

}/*** 脚本变量

*@throwsException*/@Testpublic void scriptVar() throwsException{

ScriptEngineManager manager= newScriptEngineManager();

ScriptEngine engine= manager.getEngineByName("JavaScript");

File file= new File("F:/test/test.txt");//将File对象f直接注入到js脚本中并可以作为全局变量使用

engine.put("files", file);

engine.eval("print(files.getPath());print(files.getName());");

}/*** 使用Script实现java接口

*@throwsException*/

public void runnableImpl() throwsException{

ScriptEngineManager manager= newScriptEngineManager();

ScriptEngine engine= manager.getEngineByName("JavaScript");//String里定义一段JavaScript代码脚本

String script = "function run() { print('run called'); }";//执行这个脚本

engine.eval(script);//从脚本引擎中获取Runnable接口对象(实例). 该接口方法由具有相匹配名称的脚本函数实现。

Invocable inv =(Invocable) engine;//在上面的脚本中,我们已经实现了Runnable接口的run()方法

Runnable runnable = inv.getInterface(Runnable.class);//启动一个线程运行上面的实现了runnable接口的script脚本

Thread thread = newThread(runnable);

thread.start();

}/*** 脚本引擎的多个scope

*@throwsException*/@Testpublic void multiScopes() throwsException{

ScriptEngineManager manager= newScriptEngineManager();

ScriptEngine engine= manager.getEngineByName("nashorn");//打印全局变量 "x"

engine.put("x", "hello word!!");

engine.eval("print(x);");//上面的代码会打印"hello word!!"//现在,传入另一个不同的script context

ScriptContext context = newSimpleScriptContext();//新的Script context绑定ScriptContext的ENGINE_SCOPE

Bindings bindings =context.getBindings(ScriptContext.ENGINE_SCOPE);//增加一个新变脸到新的范围 engineScope 中

bindings.put("x", "word hello!!");//执行同一个脚本 - 但这次传入一个不同的script context

engine.eval("print(x);", bindings);

engine.eval("print(x);");

}public static void main(String[] args) throwsException {newJavaScriptFunction().runnableImpl();

List list= newArrayList();

list.add("1");

list.add("1");

list.add("1");for(Object object : list) {

System.out.println(object);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值