OpenJDK源码研究笔记(十六):在Java中使用JavaScript脚本语言
友情提示
本文主要参考了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)
OpenJDK源码研究笔记(十六):在Java中使用JavaScript脚本语言的更多相关文章
- OpenJDK源码研究笔记(十五):吐槽JDK中的10个富有争议的设计
前14篇文章,分享了JDK中值得学习和借鉴的编码和设计方法. 每个硬币都是有两面的.Every coin has two sides. 当然,JDK中也有很多值得改进或者说富有争议的设计. 本篇,就来 ...
- OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools. ...
- OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...
- OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式
在阅读Javac源码的过程中,发现一个上下文对象Context. 这个对象用来确保一次编译过程中的用到的类都只有一个实例,即实现我们经常提到的"单例模式". 今天,特意对这个上下文 ...
- OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类
在研究OpenJDK源码过程中,我发现常用的设计方法就是2种:接口,接口-抽象类-具体实现类 . 在一些其它开源框架和业务开发中,经常存在着第3种设计,接口-具体实现类. 1.只有接口,没有实现类. ...
- OpenJDK源码研究笔记(八)-详细解析如何读取Java字节码文件(.class)
在上一篇OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构中,我们大致了解了Java字节码文件的结构. 本篇详细地介绍了如何读取.class文件的大部分细节. 1.构造文件 ...
- OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)
摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...
- OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)
Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区 ...
- OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构
最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码. 为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构. 于是,我就认真看了下OpenJDK中J ...
随机推荐
- cocos2dx 3.0正式版 在mac上新建项目
触碰科技确定2.x版本号不会再更新了,会一直维护3.x的版本号.于是赶紧看看3.0的,简单浏览一下.类的使用方法和原来的几乎相同,仅仅是 表达的写法变了下,. . . . 以后肯定有非常多变化,速度熟 ...
- 【Android实战】Android沉浸式状态栏实现(下)
之前的Android沉浸式状态栏实现并没有考虑软键盘的影响,接下来的内容将会针对这个问题给出解决方式,先看一下效果图 这个是一个留言板的效果图: 即弹出软键盘的时候并不会导致整个布局上移. 详细怎样实 ...
- jquery源码12 offset() : 位置和尺寸的方法
// Back Compat <1.8 extension point jQuery.fx.step = {}; if ( jQuery.expr && jQuery.expr. ...
- jQuery08源码 (5140 , 6057) DOM操作 : 添加 删除 获取 包装 DOM筛选
jQuery.fn.extend({ //$('ul').find('li').css('background','red'); //$('ul').find( $('li') ).css('back ...
- layer:web弹出层解决方案
layer:web弹出层解决方案 一.总结 一句话总结:http://layer.layui.com/ 1.layer中弹出层tips的使用(代码)是怎样的? 使用还是比较简单方便的 //tips层- ...
- js插件---video.js如何使用
js插件---video.js如何使用 一.总结 一句话总结:还是要去官方网站去看英文文档.快点把英语学好啊. 1.如何快速使用这些插件(比如video.js)? 直接百度这些js如何使用就可以了,这 ...
- jq ---- 实现浏览器全屏
// 点击进入全屏 方法. var fullscreen=function(){ elem=document.body; if(elem.webkitRequestFullScreen){ elem. ...
- [论文笔记] CUDA Cuts: Fast Graph Cuts on the GPU
Paper:V. Vineet, P. J. Narayanan. CUDA cuts: Fast graph cuts on the GPU. In Proc. CVPR Workshop, 200 ...
- windows下go语言环境
1 liteIDE ,随便装哪儿都行 2 GO语言包 安装 ,我安装到了 c:\go (顺便给个地址下载地址 https://golang.org/dl/ ) 3 GCC编译器 安装,同 ...
- Oracle 11g win7 64位【桌面类 && 服务器类】安装过程
Oracle 11g win7 64位[桌面类 && 服务器类]安装过程 一.首先,根据自己的操作系统位数(32位或64位),到官网下载相应的安装程序,如下图所示. ...