如何从Java向Nashorn对象传递Javascript本机类型?

如何从Java向Nashorn对象传递Javascript本机类型?,javascript,java-8,nashorn,Javascript,Java 8,Nashorn,出于安全原因,我想传递给Nashorn原生Java类型中的JS函数 如果我创建引擎并运行以下操作: NashornScriptEngineFactory nashornScriptEngineFactory = new NashornScriptEngineFactory(); ScriptEngine engine = nashornScriptEngineFactory.getScriptEngine(); engine.eval(s

出于安全原因,我想传递给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的本地字符串中?

一个简单但有效的解决方案。只需让引擎加载一段JS代码,如

function strclone(str){
 return new String(str);
}
然后每次都从Java调用它。这将产生一个JSObject和一个可传递给JS函数的propert JS字符串:

JSObject strclone = (JSObject) engine.get("strclone");
JSObject jsString = strclone.call(null,"some Java string");
someOtherJsMethod.call(null, jsString);

JS字符串基本类型值是java.lang.String对象。比如说,

jjs> "hello".getClass()
class java.lang.String
jjs> "hello".class
class java.lang.String
i、 例如,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”运行时权限,否则它将无法从脚本执行任何Java反射。因此,访问任何Java对象的类对象不会构成任何安全线程。

可以扩展
JSObject
,但我不确定这是一个好主意。这个类在packages下。我已经看过了,但是我没有看到任何明显的方法将它变成一个js字符串,只是一个具有属性的常规对象。此外,它没有任何用于基本类型的is*方法,如数字字符串等。。。