出于安全原因,我想传递给 Nashorn 原生 Java 类型中的 JS 函数。
如果我创建一个引擎并运行以下命令:
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 的 native 字符串中的内容?
最佳答案
JS String 原始类型值是 java.lang.String 对象。例如,
jjs> "hello".getClass()
class java.lang.String
jjs> "hello".class
class java.lang.String
即,nashorn 中没有使用单独的“JS String”类型。 Nashorn 尝试尽可能避免包装 Java/JS 类型。
您担心的具体问题是什么?通过“Class”对象反射访问字符串?请注意,默认情况下,如果您在 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 对象不会造成任何安全线程。
关于javascript - 如何将 Javascript native 类型从 Java 传递给 Nashorn 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32797456/