JAVA其实早在JDK1.6中就集成了JSR223包括JavaScript、Python等脚本功能。当我们遇到需要支持插件等拓展功能的项目时,比起反射,脚本更加简单易用。下面以JavaScript为例,简单介绍一下脚本在Java中的用法。
初始化脚本引擎:
ScriptEngineManager manager = new ScriptEngineManager(); |
定义一段简单的js脚本并绑定到脚本引擎中,在Java中传递参数执行脚本的方法,并获得返回值:
try{ String script = "function getStr(name) { return 'Hello ' + name;}"; jsEngine .eval(script); Invocable inv = (Invocable) engine;
System.out.println((String) inv.invokeFunction("getStr", "LeeStorm")); |
js中也是可以直接操作java对象的,比如我们新建一个Jrame传递给js来设置属性:
Invocable in = (Invocable) jsEngine; |
js代码:
function setFrame(f) { |
运行效果:
还可以给脚本引擎绑定全局的java对象。举个例子,比如我们要委托js做一些界面绘制,但是有些方法在js中封装比较麻烦,我们可以在java中封装一个类似类库的对象:
public class ScriptLib public Image loadImage(String filePath){…} public void setDrawColor(GraphicsContext gc, int a, int r, int g, int b){…} public void drawImage(GraphicsContext gc, Image img, int x, int
y){…} |
将类库对象绑定到js中作为全局变量:
Bindings bd = jsEngine.createBindings(); bd.put("ScriptLib", ScriptLib.getInstance()); |
这样一来,在js中就可以方便地使用啦:
function paint(graphicsContext) { var img = ScriptLib.loadImage(imgPath); ScriptLib.drawImage(graphicsContext, img, 0, 0); } |
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。