在有些情况下需要在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相关推荐

  1. java构造函数重载调用,在Java中调用ambiguously重载的构造函数

    I just saw this C# question and wondered, if something similar could happen in Java. It can, with cl ...

  2. 采用Rhino在JAVA中运行JavaScript

    由于有些网页采用的是swing技术实现(用swing也可以做出好看的界面),在其中使用JavaScript的话可以采用Rhino 对于Rhino的介绍和使用可以参看这篇文章--Rhino 使 Java ...

  3. java中调用python

    在Java中调用Python </h1><div class="clear"></div><div class="postBod ...

  4. 如何在java中调用js方法

    [java] view plain copy/* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEngineManager manager ...

  5. 在Java中调用Python,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 写在 ...

  6. java中调用js_java编程中实现调用js方法分析

    本文实例讲述了java编程中实现调用js方法.分享给大家供大家参考,具体如下: /* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEng ...

  7. 在Java中调用Python

    写在前面 参考:https://www.cnblogs.com/nuccch/p/8435693.html 在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢.当然 ...

  8. java 中调用 Matlab 的函数

    一.matlab版本必须支持java 在command 模式下面运行deploytool,如果支持该命令即可使用 二.matlab中function的书写 %定义一个函数operation(a,b), ...

  9. java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本

    举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

  10. java 调用 go_实践总结:在 Java 中调用 Go 代码

    在 Java 中调用 Go 的大致过程如下go --> cgo --> jna --> java 整个过程要解决的问题主要两个:数据类型在两种语言中如何转化 何时清理无用的数据 下面 ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task23. 不同的二叉搜索树 II
  2. Cpp 对象模型探索 / 程序转化语义
  3. shell脚本采用crontab定时备份数据库日志
  4. [转载]Python量化交易平台开发教程系列0-引言
  5. 生成下拉框的几种方法总结——数据来源:枚举
  6. linux下的asp.net服务器,Linux(Ubuntu)下搭建ASP.NET Core环境
  7. 进程环境之命令行参数
  8. springcloud问题
  9. 常用Feed流架构实现
  10. Knockout应用开发指南 监控属性(Observables)
  11. redis中字符串(String)类型常见命令操作 (附有示例)
  12. 韩信点兵问题的简单算法 downmoon
  13. Mac新手操作指南(三)
  14. 南方电网数据安全建设分析——云集至
  15. SHUOJ 2333
  16. OMAP850 运行android
  17. Esp8266进阶之路11 企业者的福音之8266接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至!
  18. EFR32上用DMA实现UART高速数据传输
  19. 51c语言字符,51单片机C语言教程(九) 语句应用
  20. java 判断文件是否存在

热门文章

  1. LTE-4G网络普及
  2. C语言程序身高英尺转换为厘米
  3. 赛门铁克备份软件文档_备份您的Google文档
  4. 深度学习入门:手把手教你用TensorFlow搭建图像识别模块
  5. [字节跳动编程题]雀魂启动!
  6. OCP/OCA认证考试资料及工具软件分享
  7. JAVA中oracle分页语句,oracle分页查询语句,java得到分页查询语句的方法
  8. FJUT-cwl的女朋友3 凑钱最少张数问题
  9. 第一节项目整体管理学习笔记
  10. ubuntu 系统连接 xiaomi手机