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,这俩顺序颠倒就不会有问题了,也不知道这是为啥。
...全文
36 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

50,545

社区成员

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

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