java调用js方法Invocation.invoke方法奇怪的问题

hitzmr 2019-10-23 04:09:11
问题描述:从在线代码格式化那里拿到了格式化json的源码,想做成本地化的更加方便,因为他们的源码是在js里面,我只会java代码,所以我想通过java调用javascript方法得到格式化的数据。代码写完后在IDEA中运行是没有问题的,但是在cmd中使用 java classfile 的方式始终返回null,不知道是什么原因。大家可以直接把我的代码复制过去跑一下试试看会不会也像我这样。 以下是IDEA中能成功运行但是编译好后无法正常运行的最精简化的代码

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.FileNotFoundException;
import java.io.FileReader;

/**
 * @description: 得到了JSON格式化的js源码,通过java调用js文件执行相关方法得到相应的返回值,再使用StringEscapeUtils处理
 * @author: MrZ
 * @create: 2019-10-22
 **/
public class Test { /** * 调用js文件获取url * * @param * @return * @throws ScriptException * @throws FileNotFoundException * @throws NoSuchMethodException */ public static void main(String[] args) throws FileNotFoundException, ScriptException { ScriptEngineManager engineManager = new ScriptEngineManager(); ScriptEngine engine = engineManager.getEngineByName("nashorn"); String path = Test.class.getResource("/").getPath(); String reader = "D:\\c_user_defined.js"; engine.eval(new FileReader(reader)); Invocable inv = (Invocable) engine; String rawStr = "{\n" + "\"employees\": [\n" + "{ \"firstName\":\"Bill\" , \"lastName\":\"Gates\" },\n" + "{ \"firstName\":\"George\" , \"lastName\":\"Bush\" },\n" + "{ \"firstName\":\"Thomas\" , \"lastName\":\"Carter\" }\n" + "]\n" + "}"; String formatedStr = null; try { formatedStr = (String) inv.invokeFunction("Process", rawStr); } catch (ScriptException e) { System.out.println(e); } catch (NoSuchMethodException e) { System.out.println(e); } System.out.println("formatedStr : " + formatedStr); }

}
以下是js代码,文件名为c_user_defined.js, 在以上java代码中写死了放在d盘根目录,js代码不是很熟悉,所以我改的不彻底,只保证能跑。。。。

QuoteKeys = true;
SINGLE_TAB = "  ";
function IsArray(obj) { return obj && typeof obj === 'object' && typeof obj.length === 'number' && !(obj.propertyIsEnumerable('length'));
}

function Process(json) { SetTab(); IsCollapsible = true; var html = ""; try { if (json == "") json = "\"\""; var obj = eval("[" + json + "]"); html = ProcessObject(obj[0], 0, false, false, false); //return html.replace(/<(style|script|iframe)[^>]*?>[\s\S]+?<\/\1\s*>/gi,'').replace(/<[^>]+?>/g,'').replace(/\s+/g,' ').replace(/ /g,' ').replace(/>/g,' '); return html; } catch(e) { return; }
}
_dateObj = new Date();
_regexpObj = new RegExp();
function ProcessObject(obj, indent, addComma, isArray, isPropertyContent) { var html = ""; var comma = (addComma) ? "<span class='Comma'>,</span> ": ""; var type = typeof obj; var clpsHtml = ""; if (IsArray(obj)) { if (obj.length == 0) { html += GetRow(indent, "<span class='ArrayBrace'>[ ]</span>" + comma, isPropertyContent); } else { clpsHtml = IsCollapsible ? "<span></span><span class='collapsible'>": ""; html += GetRow(indent, "<span class='ArrayBrace'>[</span>" + clpsHtml, isPropertyContent); for (var i = 0; i < obj.length; i++) { html += ProcessObject(obj[i], indent + 1, i < (obj.length - 1), true, false); } clpsHtml = IsCollapsible ? "</span>": ""; html += GetRow(indent, clpsHtml + "<span class='ArrayBrace'>]</span>" + comma); } } else if (type == 'object') { if (obj == null) { html += FormatLiteral("null", "", comma, indent, isArray, "Null"); } else if (obj.constructor == _dateObj.constructor) { html += FormatLiteral("new Date(" + obj.getTime() + ") /*" + obj.toLocaleString() + "*/", "", comma, indent, isArray, "Date"); } else if (obj.constructor == _regexpObj.constructor) { html += FormatLiteral("new RegExp(" + obj + ")", "", comma, indent, isArray, "RegExp"); } else { var numProps = 0; for (var prop in obj) numProps++; if (numProps == 0) { html += GetRow(indent, "<span class='ObjectBrace'>{ }</span>" + comma, isPropertyContent); } else { clpsHtml = IsCollapsible ? "<span></span><span class='collapsible'>": ""; html += GetRow(indent, "<span class='ObjectBrace'>{</span>" + clpsHtml, isPropertyContent); var j = 0; for (var prop in obj) { var quote = QuoteKeys ? "\"": ""; html += GetRow(indent + 1, "<span class='PropertyName'>" + quote + prop + quote + "</span>: " + ProcessObject(obj[prop], indent + 1, ++j < numProps, false, true)); } clpsHtml = IsCollapsible ? "</span>": ""; html += GetRow(indent, clpsHtml + "<span class='ObjectBrace'>}</span>" + comma); } } } else if (type == 'number') { html += FormatLiteral(obj, "", comma, indent, isArray, "Number"); } else if (type == 'boolean') { html += FormatLiteral(obj, "", comma, indent, isArray, "Boolean"); } else if (type == 'function') { if (obj.constructor == _regexpObj.constructor) { html += FormatLiteral("new RegExp(" + obj + ")", "", comma, indent, isArray, "RegExp"); } else { obj = FormatFunction(indent, obj); html += FormatLiteral(obj, "", comma, indent, isArray, "Function"); } } else if (type == 'undefined') { html += FormatLiteral("undefined", "", comma, indent, isArray, "Null"); } else { html += FormatLiteral(obj.toString().split("\\").join("\\\\").split('"').join('\\"'), "\"", comma, indent, isArray, "String"); } return html;

}

function FormatLiteral(literal, quote, comma, indent, isArray, style) { if (typeof literal == 'string') literal = literal.split("<").join("<").split(">").join(">"); var str = "<span class='" + style + "'>" + quote + literal + quote + comma + "</span>"; if (isArray) str = GetRow(indent, str); return str;

}

function FormatFunction(indent, obj) { var tabs = ""; for (var i = 0; i < indent; i++) tabs += TAB; var funcStrArray = obj.toString().split("\n"); var str = ""; for (var i = 0; i < funcStrArray.length; i++) { str += ((i == 0) ? "": tabs) + funcStrArray[i] + "\n"; } return str;

}

function GetRow(indent, data, isPropertyContent) { var tabs = ""; for (var i = 0; i < indent && !isPropertyContent; i++) tabs += TAB; if (data != null && data.length > 0 && data.charAt(data.length - 1) != "\n") data = data + "\n"; return tabs + data;

} function TraverseChildren(element, func, depth) { for (var i = 0; i < element.childNodes.length; i++) { TraverseChildren(element.childNodes[i], func, depth + 1); } func(element, depth);

}

function ExpImgClicked(img) { var container = img.parentNode.nextSibling; if (!container) return; var disp = "none"; if (container.style.display == "none") { disp = "inline"; } container.style.display = disp; img.src = src;

} function TabSizeChanged() { Process();

}

function SetTab() { TAB = MultiplyString(parseInt(2), SINGLE_TAB);

} function MultiplyString(num, str) { var sb = []; for (var i = 0; i < num; i++) { sb.push(str); } return sb.join("");

}
还有一个奇怪的问题就是,如果在js文件中前两个变量的声明顺序是这样的 SINGLE_TAB = " "; QuoteKeys = true; 那么在cmd窗口启动程序就会报:javax.script.ScriptException: ReferenceError: "SINGLE_TAB" is not defined in <eval> at line number 201,这俩顺序颠倒就不会有问题了,也不知道这是为啥。
...全文
41 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
abstract (关键字) 抽象 ['æbstrækt] access vt.访问,存取 ['ækses]'(n.入口,使用权) algorithm n.算法 ['ælgәriðm] Annotation [java] 代码注释 [ænәu'teiʃәn] anonymous adj.匿名的[ә'nɒnimәs]'(反义:directly adv.直接地,立即[di'rektli, dai'rektli]) apply v.应用,适用 [ә'plai] application n.应用,应用程序 [,æpli'keiʃәn]' (application crash 程序崩溃) arbitrary a.任意的 ['ɑ:bitrәri] argument n.参数;争论,论据 ['ɑ:gjumәnt]'(缩写 args) assert (关键字) 断言 [ә'sә:t] ' (java 1.4 之后成为关键字) associate n.关联(同伴,伙伴) [ә'sәuʃieit] attribute n.属性(品质,特征) [ә'tribju:t] boolean (关键字) 逻辑的, 布尔型 call n.v.调用; 呼叫; [kɒ:l] circumstance n.事件(环境,状况) ['sә:kәmstәns] crash n.崩溃,破碎 [kræʃ] cohesion 内聚,黏聚,结合 [kәu'hi:ʒәn] (a class is designed with a single, well-focoused purpose. 应该不止这点) command n. 命令,指令 [kә'mɑ:nd](指挥, 控制) (command-line 命令行) Comments [java] 文本注释 ['kɒments] compile [java] v.编译 [kәm'pail]' Compilation n.编辑[,kɒmpi'leiʃәn] const (保留字) constant n. 常量, 常数, 恒量 ['kɒnstәnt] continue (关键字) coupling 耦合,联结 ['kʌpliŋ] making sure that classes know about other classes only through their APIs. declare [java] 声明 [di'klєә] default (关键字) 默认值; 缺省值 [di'fɒ:lt] delimiter 定义符; 定界符 Encapsulation[java] 封装 (hiding implementation details) Exception [java] 例外; 异常 [ik'sepʃәn] entry n.登录项, 输入项, 条目['entri] enum (关键字) execute vt.执行 ['eksikju:t] exhibit v.显示, 陈列 [ig'zibit] exist 存在, 发生 [ig'zist] '(SQL关键字 exists) extends (关键字) 继承、扩展 [ik'stend] false (关键字) final (关键字) finally (关键字) fragments 段落; 代码块 ['frægmәnt] FrameWork [java] 结构,框架 ['freimwә:k] Generic [java] 泛型 [dʒi'nerik] goto (保留字) 跳转 heap n.堆 [hi:p] implements (关键字) 实现 ['implim

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧