我正在使用Rhino在Java应用程序中嵌入一些javascript.我正在关注Rhino网站上的示例,通过调用Context的evaluateString方法执行脚本并将实际脚本作为String传递.
我有一大堆现有的javascript代码,我想利用它.我不想将它全部连接成一个巨大的String并将其传递给evaluateString.我宁愿能够加载代码,以便我可以从我传递给evaluateString的代码中调用它(有点像AddCode方法在Microsoft的脚本控制中工作).我想添加代码,就像我目前可以使用ScriptableObject.putProperty方法添加变量一样.
有没有办法做到这一点?有人可以提供代码段或文档链接.谢谢!
我想导入一个我已经在外部文件夹中编写的类,例如:我的类Example.java
位于c:\class\Example.java
我的脚本中,就像使用一样
var importedClass = new JavaImporter("c:\\class\\Example.java");
Run Code Online (Sandbox Code Playgroud)
要么
importClass("c:\\class\\Example.java");
Run Code Online (Sandbox Code Playgroud)
这是在ScriptEngine 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"文件中调用该方法.
非常感谢您的帮助!
我的印象是WebKit是一个更通用的框架,可以插入多个JavaScript引擎.最突出的是,我们同时拥有Apple的JavaScriptCore和Google的V8.
有没有人试图插入Mozilla的Rhino?如果他们没有,你能否指点我所涉及的一些简短资源?(我不太可能由我自己承担这个,但我很感兴趣的是如何在这一领域的WebKit的扩展点的结构,只是为了好奇.)
另外,如果我对WebKit,JavaScriptCore和V8之间关系的理解不正确,那么让我直截了当就会得到一个很好的答案.
我已经在LibGDX上编写完整的游戏引擎了一段时间,并且几乎用Javascript编写了每个游戏对象(我创建了一个基于复合的游戏对象系统).对于JS的解释,我使用了我的ubuntu系统上的Rhino引擎,效果非常好,但是当我尝试在Android上运行它时,我根本无法编译它,而是我读过的,这是因为谷歌没有使用支持Rhino的标准Java实现,但现在我看到了对SL4A项目的支持,但是我一直在寻找一个与Android兼容的简单Rhino jar文件,但在查看了下载之后,我所有的发现是APK文件,似乎没有图书馆,从我读过的,APK被认为是一个模板项目,但我怎么能用我的现有代码没有jar包?也许我完全忽略了这一点?
我是Rhino解析器的新手.我可以在javascript代码中使用此rhino解析器来提取任何html文件中的javascript代码的抽象语法树.如果是这样我应该开始这个.这是用于分析AST的代码,用于计算javascript中使用的关键字和单词之间的比率,识别常见的解密方案,以及计算某些类函数调用的出现次数,例如fromCharCode() ,eval()和一些字符串函数,这些函数通常用于解密和执行逐个下载漏洞利用程序.
ScriptEngineManager.getEngineByName查找并为给定名称创建一个ScriptEngine。
Rhino将自己注册为“ js”,“ rhino”,“ JavaScript”,“ javascript”,“ ECMAScript”和“ ecmascript”
Nashorn将自己注册为“ nashorn”,“ Nashorn”,“ js”,“ JS”,“ JavaScript”,“ javascript”,“ ECMAScript”和“ ecmascript”
如果我使用Nashorn和Rhino均已注册的“ js”之类的名称,将使用哪个脚本引擎?它将在Java 8和Rhino上使用Nashorn吗?
我正在尝试用Javascript实现我自己的TrustManager,但是我不知道如何实现它。
在Java中,我具有以下内容:
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};
Run Code Online (Sandbox Code Playgroud)
我尝试对X509TrustManager使用以下代码:
js> obj = { getAcceptedIssuers : function() { return null; }, checkClientTrusted: function() { }, checkServerTrusted: function() { } }
[object Object]
js> x509tm = new javax.net.ssl.X509TrustManager(obj)
adapter1@2eee9593
js>
Run Code Online (Sandbox Code Playgroud)
然后,我不知道如何创建TrustManager。如何使用Javascript(Rhino 1.6版本7 2008 01 02)执行此操作?
我有一个以下类,其中一个类型为Long
package com.nm.poc;
public class JSLong{
private Long longValue;
public Long getLongValue() {
return longValue;
}
public void setLongValue(Long longValue) {
this.longValue = longValue;
}
public Long testLongValue(Long longValue){
return longValue;
}
}
Run Code Online (Sandbox Code Playgroud)
我按照以下方式从JavaScript调用方法testLongValue
package com.nm.poc;
import java.util.function.Consumer;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class Main {
public static void main(String[] args) throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
JSLong jsLong = new JSLong();
//WORKS
engine.put("jsLong", jsLong);
engine.eval("print(jsLong.testLongValue(20))");
//Throws ClassCast Integer to Long
engine.put("jsLong2", (Consumer<Long>)jsLong::testLongValue);
engine.eval("print(jsLong2(20))"); …
Run Code Online (Sandbox Code Playgroud)