如何将Javascript原生类型从Java传递给Nashorn对象
How to pass Javascript native types to Nashorn objects from Java?
出于安全原因,我希望将javascript函数传递给Nashorn原生Java类型。
如果我创建一个引擎并运行以下命令:
NashornScriptEngineFactory nashornScriptEngineFactory = new NashornScriptEngineFactory();
ScriptEngine engine = nashornScriptEngineFactory.getScriptEngine();
engine.eval(script);
Invocable invocable = (Invocable) engine;
JSObject objectWork = (JSObject) engine.get("objectWork");
objectWork.call(null,"eee");
脚本为
function objectWork(arg){
print ("arg is "+ typeof arg);
print ("arg.getClass()"+ arg.getClass());
for (var k in arg){
print(k);
}
}
输出为
arg is string
arg.getClass()class java.lang.String
我对第二个不太满意,我不知道getClass是否暴露了java.lang.Class对象的任何方法。是否有一种方法可以传递一些东西,将Java字符串包装在本机扩展Nashorn自己的JSObject中?
JS字符串原语类型值是java.lang.String对象。例如,
jjs> "hello".getClass()
class java.lang.String
jjs> "hello".class
class java.lang.String
。,在nashorn中没有使用单独的"JS字符串"类型。Nashorn尽量避免包装Java/JS类型。
你担心的具体问题是什么?通过"类"对象反射访问字符串?请注意,默认情况下,如果在SecurityManager下运行,则不允许脚本使用Java反射。
$ jjs -J-Djava.security.manager
jjs> "hello".class
class java.lang.String
jjs> "hello".class.getMethods()
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "nashorn.JavaReflection")
jjs>
所以,除非你给"nashorn "。JavaReflection" RuntimePermission到一个脚本,它将不能从脚本做任何Java反射。因此,访问任何Java对象的Class对象都不会产生任何安全线程。
一个简单但有效的解决方案。只需让引擎加载一段JS代码,如
function strclone(str){
return new String(str);
}
,然后每次从Java调用它。这将导致一个JSObject和一个属性JS字符串,可以传递给JS函数:
JSObject strclone = (JSObject) engine.get("strclone");
JSObject jsString = strclone.call(null,"some Java string");
someOtherJsMethod.call(null, jsString);
相关文章:
- 引用对象中的通用值
- jQuery匹配JSON对象的部分文本
- 节点导出返回一个空对象
- 如何在Javascript中将JSon对象转换为数组
- 我可以在json对象中添加一个函数吗
- 使用JS将数组转换为json对象
- 全局变量和全局对象的属性之间有什么区别吗
- 比较从函数和生成的日期对象
- Javascript,访问一个主要对象模块模式中的每个对象
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 调整窗口大小时,可拖动的对象会出现在容器外部
- 将toString方法暴露给nashorn中的js对象
- Nashorn:在 Typescript 中导入 Java 对象
- ===当两个引用都应该指向同一个对象时,在Nashorn中返回false
- 在多个nashorn脚本引擎之间共享JavaScript数组和对象
- 如何将Javascript原生类型从Java传递给Nashorn对象
- 在Nashorn中启用乐观类型的嵌套对象中出现奇怪的行为(属性设置为零)
- Nashorn.绑定本地Java对象
- Java Nashorn在Java中创建JS对象,当我有一个代表JS函数的对象时
- Java Nashorn中的访问对象变量