Hae*_*ung 5 javascript java embed compiler-construction rhino
我将以下JavaScript文件"test.js"编译成"test.class":
var test = (function () {
var that = {};
that.addNumbers = function (a, b) {
return a+b;
};
return that;
}());
Run Code Online (Sandbox Code Playgroud)
我想在简单的Java程序"run.java"中调用已编译的JavaScript函数"test.addNumbers(1,2)",如下所示:
public class run {
public static void main(String[] args) throws Exception {
Context cx = Context.enter();
try {
Scriptable scope = cx.initStandardObjects();
// HOW TO CALL THE METHOD, Test.addNumbers(1,2)? Please help me!
} finally {
Context.exit();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了很多方法,但都失败了.我阅读了Rhino教程并检查了许多文章和示例,但他们只展示了如何从命令行或源文件"test.js"调用JavaScript方法.我需要从编译的"test.class"文件中调用该方法.
非常感谢您的帮助!
使用javap,我相信JavaScript类型test并不意味着生成的Java类型就是这个类.生成的Java类型在其构造函数中调用脚本代码; 这不会导致addNumbers作为Java方法暴露.
>javap -classpath . test
public class test extends org.mozilla.javascript.NativeFunction implements org.m
ozilla.javascript.Script{
public test(org.mozilla.javascript.Scriptable, org.mozilla.javascript.Contex
t, int);
public test();
public static void main(java.lang.String[]);
public final java.lang.Object exec(org.mozilla.javascript.Context, org.mozil
la.javascript.Scriptable);
public final java.lang.Object call(org.mozilla.javascript.Context, org.mozil
la.javascript.Scriptable, org.mozilla.javascript.Scriptable, java.lang.Object[])
;
public int getLanguageVersion();
public java.lang.String getFunctionName();
public int getParamCount();
public int getParamAndVarCount();
public java.lang.String getParamOrVarName(int);
public java.lang.String getEncodedSource();
public boolean getParamOrVarConst(int);
}
Run Code Online (Sandbox Code Playgroud)
在行之间阅读,我会说你需要映射到Java类型来做你想要的.来自jsc doc:
-implements java-intf-name指定
java-intf-name应从传入的JavaScript源文件生成实现Java接口的java类 .源文件中的每个全局函数都是生成的类的方法,通过相同的名称实现接口中的任何方法.
定义此接口:
//Adder.java
public interface Adder {
public int addNumbers(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)
写下这个实现:
//AdderImpl.js
function addNumbers(a, b) {
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
使用参数编译JavaScript -implements Adder AdderImpl.js.像这样调用方法:
Adder adder = new AdderImpl();
int n = adder.addNumbers(1, 2);
System.out.println(n);
Run Code Online (Sandbox Code Playgroud)
我猜测由于语言类型系统的不同,可能有必要这样做.
我使用过Rhino 1.7R2.为了简洁起见,我避免使用包等.
| 归档时间: |
|
| 查看次数: |
2760 次 |
| 最近记录: |