您的位置:首页 > Web前端 > JavaScript

OpenJDK源码研究笔记(十六):在Java中使用JavaScript脚本语言

2014-01-07 23:06 746 查看

友情提示

本文主要参考了51CTO上的一篇文章,代码经过自己的模仿和整理,还算凑合。

本文中的代码注释比较多,不再过多解释。

更多用法,还是得看JDK的API或者看原文http://developer.51cto.com/art/201007/208812.htm

1.可用的脚本引擎

/**
* Java内置只支持JavaScript一种脚本
* 打印Script引擎的一些信息
*/
public static void printBuildInScriptEngine() {
ScriptEngineManager manager = new ScriptEngineManager();
List<ScriptEngineFactory> factories = manager.getEngineFactories();
for (ScriptEngineFactory factory : factories) {
println("engine name:" + factory.getEngineName());
println("engine version:" + factory.getEngineVersion());
println("language name:" + factory.getLanguageName());
println("language version:" + factory.getLanguageVersion());
println("names:" + factory.getNames());
println("mime:" + factory.getMimeTypes());
println("extension:" + factory.getExtensions());
}
}


2.一个“HelloWorld”程序

/**
*  在Java中使用JavaScript的Hello world示例
*/
public static void printHelloWorld() {
ScriptEngine engine = getJavaScriptEngine();
String helloWorldScript = "print('hello script')";
try {
engine.eval(helloWorldScript);
} catch (ScriptException e) {
e.printStackTrace();
}
println();
}


3.方法调用-第1种方式

/**
*  可以向脚本中传递变量,使得Java代码可以和脚本代码交互
*/
public static void invokeFunction() {
ScriptEngine engine = getJavaScriptEngine();
engine.put("a", 13);
engine.put("b", 24);
try {
String maxFunction = JS_MAX_FUNCTION_AND_INVOKE;
Object maxNum = engine.eval(maxFunction);
println("max:" + maxNum);
} catch (Exception e) {
e.printStackTrace();
}
}


4.方法调用-第2种方式

/**
* 方法调用,第2种方式
*/
public static void invokeFunction2() {
ScriptEngine engine = getJavaScriptEngine();
try {
engine.eval(JS_MAX_FUNCTION);
Invocable invoke = (Invocable) engine;
Object maxNum = invoke.invokeFunction(MAX_FUNCTION_NAME, 88, 99);
println(maxNum);
maxNum = invoke.invokeFunction(MAX_FUNCTION_NAME, 99, 111);
println(maxNum);
} catch (Exception e) {
e.printStackTrace();
}

}


5.方法调用-第3种方式

/**
* 方法调用第3种方式
*/
public static void invokeFunction3() {
ScriptEngine engine = getJavaScriptEngine();
try {
engine.eval(JS_MAX_FUNCTION);
Invocable invoke = (Invocable) engine;
JSLib jslib = invoke.getInterface(JSLib.class);
int maxNum = jslib.max(2013, 1989);
println(maxNum);
} catch (Exception e) {
e.printStackTrace();

}
}


6.在JavaScript中使用Java对象和方法

/**
* 在JavaScript中使用Java对象和方法
*/
public static void useJavaObject() {
ScriptEngine engine = getJavaScriptEngine();
try {
String script = "var list = java.util.ArrayList();list.add('CSDN FanUnion');print(list.get(0));";
engine.eval(script);
} catch (Exception e) {
e.printStackTrace();
}
}


7.编译JS代码,然后执行

/**
* 编译JS代码,然后执行
*/
public static void compileExecute() {
ScriptEngine engine = getJavaScriptEngine();
try {
Compilable compEngine = (Compilable) engine;
CompiledScript script = compEngine.compile(JS_MAX_FUNCTION);
script.eval();
//强制转换,Invocable和Compilable都是脚本引擎可选实现的
//如果这个地方的脚本引擎没有实现这个接口,应该会报错
Invocable invoke = (Invocable) engine;
Object maxNum = invoke
.invokeFunction(MAX_FUNCTION_NAME, 2020, 2050);
println(maxNum);
} catch (Exception e) {
e.printStackTrace();
}
}


8.工具方法和接口

/**
* 工具方法:创建JS-引擎
*/
private static ScriptEngine getJavaScriptEngine() {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName(JS_ENGINE_NAME);
return engine;
}

public static void println() {
System.out.println();
}

public static void println(Object str) {
System.out.println(str);
}

/**
* 定义了求最大值的一个接口
*/
interface JSLib {
public int max(int a, int b);
}


下载地址:本文已经给出了所有的源代码了。建议自己写一遍,不懂的参考API。

CSDN下载频道有源码,需要1分。(有兴趣的自己花1分,下载吧)

上传资源,迟迟不出来,晚点再给出下载地址

http://download.csdn.net/detail/fansunion/6821829

参考资料http://developer.51cto.com/art/201007/208812.htm

原文链接:http://blog.fansunion.cn/articles/2839(小雷博客-blog.fansunion.cn)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: