友情提示

本文主要参考了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脚本语言的更多相关文章

  1. OpenJDK源码研究笔记(十五):吐槽JDK中的10个富有争议的设计

    前14篇文章,分享了JDK中值得学习和借鉴的编码和设计方法. 每个硬币都是有两面的.Every coin has two sides. 当然,JDK中也有很多值得改进或者说富有争议的设计. 本篇,就来 ...

  2. OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天

    在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools. ...

  3. OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa

    元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...

  4. OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式

    在阅读Javac源码的过程中,发现一个上下文对象Context. 这个对象用来确保一次编译过程中的用到的类都只有一个实例,即实现我们经常提到的"单例模式". 今天,特意对这个上下文 ...

  5. OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类

    在研究OpenJDK源码过程中,我发现常用的设计方法就是2种:接口,接口-抽象类-具体实现类 . 在一些其它开源框架和业务开发中,经常存在着第3种设计,接口-具体实现类. 1.只有接口,没有实现类. ...

  6. OpenJDK源码研究笔记(八)-详细解析如何读取Java字节码文件(.class)

    在上一篇OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构中,我们大致了解了Java字节码文件的结构. 本篇详细地介绍了如何读取.class文件的大部分细节. 1.构造文件  ...

  7. OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)

    摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...

  8. OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)

    Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区 ...

  9. OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构

    最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码. 为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构. 于是,我就认真看了下OpenJDK中J ...

随机推荐

  1. Redisclient连接方式Hiredis简单封装使用,连接池、屏蔽连接细节

    工作须要对Hiredis进行了简单封装,实现功能: 1.API进行统一,对外仅仅提供一个接口. 2.屏蔽上层应用对连接的细节处理: 3.底层採用队列的方式保持连接池,保存连接会话. 4.重连时採用时间 ...

  2. JavaWeb-04(BOM&amp;DOM)

    JavaWeb-04 JavaWeb-BOM&DOM BOM 一.知识回想 * BOM 概述 * BOM 的各个对象 * window对象 innerHeight,innerWidth doc ...

  3. Typedef和#define之间的区别

    Typedef和define都可以用来给对象取一个别名,但是两者却有着很大不同. 1. 首先,二者执行时间不同 关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能 ...

  4. Onvif开发之客户端搜索篇

    关于ONVIF的广播,有客户端搜索和服务端发现的区别:客户端向固定的网段和固定的端口发送广播消息,服务端在对应的端口回复广播请求消息本文首先介绍客户端如何进行广播的已经对广播回复的信息的基本处理. 客 ...

  5. Gym - 100548C The Problem Needs 3D Arrays

    Problem C.   The Problem Needs 3D Arrays Time Limit: 6000MS Memory Limit: 262144KB 64bit IO Format: ...

  6. HDU 3400 Line belt (三分再三分)

    HDU 3400 Line belt (三分再三分) ACM 题目地址:  pid=3400" target="_blank" style="color:rgb ...

  7. 高速数论变换(NTT)

    今天的A题.裸的ntt,但我不会,于是白送了50分. 于是跑来学一下ntt. 题面非常easy.就懒得贴了,那不是我要说的重点. 重点是NTT,也称高速数论变换. 在非常多问题中,我们可能会遇到在模意 ...

  8. js---15,模拟数组的ecah方法

    原型的另外一个作用就是扩展对象中的属性和方法的 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http:// ...

  9. php如何读写excel

    php如何读写excel 一.总结 一句话总结:PHP操作Excel最好的方法是使用PHPExcel类, 可以到官网下载PHPExcel类库 http://phpexcel.codeplex.com ...

  10. Flume的Collector

    Collector的作用是将多个Agent的数据汇总后,加载到Storage中.它的source和sink与agent类似. 数据源(source),如: collectorSource[(port) ...