rhino 调用 java_rhino-java中调用javascript
在有些情况下需要在java里面执行javascript,这时rhino就可以帮忙了。mozilla的一个开源产品。
之前的一篇博客http://my.oschina.net/yybear/blog/101493里面介绍的事件模块处理程序就有利用javascript定义eventHandler,然后解释javascript执行。
先看一个简单的应用:
public class JavaScriptHandle {
private Scriptable global;
private int optimizationLevel = -1; // 介于-1到9之间,负值表示使用解释性执行,不会生成class
private Script script;
void handle() {
Context ctx = Context.enter();
try {
ctx.setOptimizationLevel(optimizationLevel);
if (script == null) {
script = ctx.compileString("var str = 'xx'", "firstRhino", 0, null);
}
Scriptable scope = new NativeObject();
scope.setParentScope(global);
script.exec(ctx, scope);
} finally {
Context.exit();
}
}
public static void main(String[] args) {
JavaScriptHandle jsh = new JavaScriptHandle();
jsh.handle();
}
} 还是很简单的,只有传入一个javascript的字符串就可以了。
但是更多时候我们希望在javascript里面也能调用java。比如我们希望执行这样的javascript
var s ='xx';$console.print(s); $console表示java里面的标准输出。
这时需要先创建一个类
public class ConsoleScriptable extends ScriptableObject {
private static final long serialVersionUID = 1L;
private PrintStream printStream;
public void setPrintStream(PrintStream printStream) {
this.printStream = printStream;
}
public ConsoleScriptable() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String getClassName() {
return ConsoleScriptable.class.getSimpleName();
}
@JSFunction
public static void print(Context cx, Scriptable thisObj, Object[] args, Function funObj) {
print0(thisObj, args, false);
}
@JSFunction
public static void println(Context cx, Scriptable thisObj, Object[] args, Function funObj) {
print0(thisObj, args, true);
}
private static void print0(Scriptable thisObj, Object[] args, boolean eol) {
PrintStream printStream = checkInstance(thisObj).printStream;
for (Object arg : args) {
printStream.print(Context.toString(arg));
}
if (eol) {
printStream.println();
}
}
private static ConsoleScriptable checkInstance(Scriptable obj) {
if (obj == null || !(obj instanceof ConsoleScriptable)) {
throw Context.reportRuntimeError("called on incompatible object");
}
return (ConsoleScriptable) obj;
} 这个类就是实现了$console打印字符的功能。使用时先要在rhino里面注册下这个类:
JavaScriptHandle() {
// 初始化
Context ctx = Context.enter();
global = ctx.initStandardObjects();
try {
ScriptableObject.defineClass(global, ConsoleScriptable.class);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} finally {
Context.exit();
}
} 使用代码:
void handle() {
Context ctx = Context.enter();
try {
ctx.setOptimizationLevel(optimizationLevel);
if (script == null) {
script = ctx.compileString("$console.print('xx');", "firstRhino", 0, null);
}
Scriptable scope = new NativeObject();
scope.setParentScope(global);
// 将$console设置标准输出
ConsoleScriptable $console = (ConsoleScriptable) ctx.newObject(scope, ConsoleScriptable.class.getSimpleName());
$console.setPrintStream(System.out);
ScriptableObject.putProperty(scope, "$console", $console); // 设置属性
script.exec(ctx, scope);
} finally {
Context.exit();
}
} 这样javascript里面就可以使用$console了。
rhino 调用 java_rhino-java中调用javascript相关推荐
- java构造函数重载调用,在Java中调用ambiguously重载的构造函数
I just saw this C# question and wondered, if something similar could happen in Java. It can, with cl ...
- 采用Rhino在JAVA中运行JavaScript
由于有些网页采用的是swing技术实现(用swing也可以做出好看的界面),在其中使用JavaScript的话可以采用Rhino 对于Rhino的介绍和使用可以参看这篇文章--Rhino 使 Java ...
- java中调用python
在Java中调用Python </h1><div class="clear"></div><div class="postBod ...
- 如何在java中调用js方法
[java] view plain copy/* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEngineManager manager ...
- 在Java中调用Python,java面试题,java初级笔试题
写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 写在 ...
- java中调用js_java编程中实现调用js方法分析
本文实例讲述了java编程中实现调用js方法.分享给大家供大家参考,具体如下: /* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEng ...
- 在Java中调用Python
写在前面 参考:https://www.cnblogs.com/nuccch/p/8435693.html 在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢.当然 ...
- java 中调用 Matlab 的函数
一.matlab版本必须支持java 在command 模式下面运行deploytool,如果支持该命令即可使用 二.matlab中function的书写 %定义一个函数operation(a,b), ...
- java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本
举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...
- java 调用 go_实践总结:在 Java 中调用 Go 代码
在 Java 中调用 Go 的大致过程如下go --> cgo --> jna --> java 整个过程要解决的问题主要两个:数据类型在两种语言中如何转化 何时清理无用的数据 下面 ...
最新文章
- 刻意练习:LeetCode实战 -- Task23. 不同的二叉搜索树 II
- Cpp 对象模型探索 / 程序转化语义
- shell脚本采用crontab定时备份数据库日志
- [转载]Python量化交易平台开发教程系列0-引言
- 生成下拉框的几种方法总结——数据来源:枚举
- linux下的asp.net服务器,Linux(Ubuntu)下搭建ASP.NET Core环境
- 进程环境之命令行参数
- springcloud问题
- 常用Feed流架构实现
- Knockout应用开发指南 监控属性(Observables)
- redis中字符串(String)类型常见命令操作 (附有示例)
- 韩信点兵问题的简单算法 downmoon
- Mac新手操作指南(三)
- 南方电网数据安全建设分析——云集至
- SHUOJ 2333
- OMAP850 运行android
- Esp8266进阶之路11 企业者的福音之8266接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至!
- EFR32上用DMA实现UART高速数据传输
- 51c语言字符,51单片机C语言教程(九) 语句应用
- java 判断文件是否存在