Rhino可以实现JAVA与javascript的互相调用,有时候我们会希望用javascript解释执行自定义的JAVA语句,如
$console.print("hello world");
这时,可以使用ScriptableObject.defineClass实现注册。具体代码实现可参考如下:
package com.zjyang.scriptable; import org.mozilla.javascript.Context; import org.mozilla.javascript.Function; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.annotations.JSFunction; import java.io.PrintStream; public class ConsoleScriptable extends org.mozilla.javascript.ScriptableObject { private static final long serialVersionUID = 1L; private java.io.PrintStream printStream; public void setPrintStream(java.io.PrintStream printStream) { this.printStream = printStream; } public ConsoleScriptable() {} @JSFunction public static void print(Context cx, Scriptable obj, Object[] args, Function funObj) { print0(obj, args, false); } @JSFunction public static void println(Context cx, Scriptable obj, Object[] args, Function funObj) { print0(obj, args, true); } private static void print0(Scriptable obj, Object[] args, boolean eol) { PrintStream printStream = checkInstance(obj).printStream; for (Object arg : args) { printStream.print(Context.toString(arg)); } if (eol) { printStream.println(); } } private static ConsoleScriptable checkInstance(Scriptable obj) { if (null == obj || !(obj instanceof ConsoleScriptable)) { throw Context.reportRuntimeError("call ed on incompatible object"); } return (ConsoleScriptable) obj; } @Override public String getClassName() { return ConsoleScriptable.class.getSimpleName(); } }
package com.zjyang.handler; import com.zjyang.scriptable.ConsoleScriptable; import org.mozilla.javascript.*; import java.io.Console; import java.lang.reflect.InvocationTargetException; public class JavaScriptHandler { private Scriptable global; private int optimizationLevel = -1; private Script script; public JavaScriptHandler() { 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(); } } public void handle() { Context ctx = Context.enter(); try { ctx.setOptimizationLevel(optimizationLevel); if (script == null) { script = ctx.compileString("$console.println('xx');", "firstRhino", 0, null); } Scriptable scope = new NativeObject(); scope.setParentScope(global); 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(); } } public static void main(String args[]) { new JavaScriptHandler().handle(); System.out.println("finish"); } }
个人感觉,在做一些应用时,不用改后台,就可以直接做开发,而且比较容易上手,因为是弱语言类型的了。
参考:http://my.oschina.net/yybear/blog/102018
相关推荐
Rhino脚本引擎在Java程序中的使用,为Java程序引入了脚本化编程的特性,使得Java程序可以更加灵活地处理动态语言的任务,同时也使得那些熟悉JavaScript语法的开发者能够在Java环境中快速上手。Rhino的引入,降低了...
标题中的“Java调用JavaScript代码”是指在Java程序中执行JavaScript脚本,实现跨语言通信。这主要通过Java的ScriptEngine接口和其相关的API来实现,这些API位于Java的javax.script包中。ScriptEngine接口提供了执行...
4. **API接口丰富**:Rhino提供了丰富的API,允许开发者方便地在Java中嵌入和控制JavaScript执行,如`ScriptEngine`和`ScriptContext`接口。 5. **源码级支持**:Rhino是开源的,源码可读,便于开发者深入理解其工作...
3. **Java API的使用**:书中会详细讲解如何通过Rhino的API在JavaScript中调用Java方法、访问Java变量和类。这包括`org.mozilla.javascript.Context`、`Scriptable`接口和`ScriptableObject`类等核心组件的使用。 4...
在Java中调用JavaScript,可以使用ScriptEngineManager来创建一个特定的ScriptEngine实例,例如用于执行JavaScript的Nashorn引擎。以下是一个简单的示例: ```java import javax.script.ScriptEngineManager; ...
除了执行简单的脚本,我们还可以在Java中调用JavaScript函数。首先,我们需要将函数定义到JavaScript环境中,然后通过`Invocable`接口来调用: ```java engine.eval("function greet(name) { return 'Hello, ' + ...
JWR,全称Java Wrapper for JavaScript,是一个库,它提供了一种更简洁的方式来在Java中调用JavaScript代码。通过JWR,开发者可以将JavaScript对象封装为Java对象,反之亦然,使得两者之间的数据交换更加便捷。 5....
在Java中使用JavaScript,官方指南主要介绍的是在Java平台标准版中嵌入和使用JavaScript脚本语言的官方指导。这通常意味着使用Java代码来调用JavaScript,并且允许JavaScript在Java应用程序内部执行。具体的知识点...
在标题《kettle中调用java类》示例代码中,我们关注的是如何在Kettle的转换或作业中嵌入Java代码,以实现更复杂的数据处理逻辑。 首先,Kettle支持两种方式来调用Java类:使用“Java Class”步骤和使用“Execute ...
在Java中执行JavaScript脚本主要涉及Java Scripting API和一个JavaScript引擎,比如Nashorn。Nashorn是自Java Development Kit 8(JDK 8)起引入的一个JavaScript引擎,它取代了之前的Rhino引擎,并提供了对...
这篇博客(博文链接已提供)将介绍如何在Java中执行JavaScript代码,这主要得益于Java的脚本引擎API。 Java 6引入了JSR 223(Java Scripting API),使得开发者能够在Java应用程序中嵌入和执行各种脚本语言,包括...
5. **脚本编写和执行**:Rhino提供了ScriptEngine接口,这是Java Scripting API (JSR 223)的一部分,使得开发者可以方便地在Java程序中执行JavaScript代码,处理脚本编写和执行的各种需求。 6. **Rhino的API**:...
Java语言在处理JavaScript脚本时,常常会借助于一些库来实现,其中一个著名的库就是Rhino。Rhino是由Mozilla开发的一个开源的JavaScript引擎,它完全用Java编写,能够将JavaScript代码编译为Java字节码,从而使得...
### BSF(Java中使用JavaScript) #### 一、BSF简介 BSF(Bean Scripting Framework,豆脚本框架)是Apache的一个项目,它提供了一种机制,使得开发者能够在Java应用中集成各种脚本语言,如JavaScript、Python、...
在Java 6版本中,引入了对脚本化语言的支持,特别是通过内置的JavaScript解释器(如Rhino),使得JavaScript可以直接与Java对象交互,执行诸如设置属性、查询状态和调用方法等操作。这一特性极大地扩展了JavaScript...
在Android开发中,Java语言是主要的编程工具,但有时候我们可能需要在应用程序中执行一些脚本代码,比如JavaScript、Python或Shell等。这通常是为了实现一些特定功能,如自动化处理、数据解析或是利用第三方库的脚本...
1. **自动化测试**:编写JavaScript脚本以自动化Java应用的测试,比如模拟用户交互或数据验证。 2. **配置管理**:在Java应用的配置文件中使用JavaScript,可以根据运行时环境动态调整配置。 3. **Web API开发**:...
Rhino以其高效的性能和强大的功能,成为Java开发者在服务器端执行JavaScript脚本的首选工具。 Rhino的核心特性在于其对ECMAScript规范的全面支持,这使得JavaScript代码能够在Java环境中无缝执行。1.7.2版本发布于...