当前位置: 首页 > 知识库问答 >
问题:

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

益银龙
2023-03-14

出于安全原因,我想传递给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.类对象的任何方法。有没有一种方法来传递将Java字符串包装在本机字符串中的东西,以扩展Nashorn自己的JSObject?

共有2个答案

公西宏峻
2023-03-14

一个琐碎但可行的解决方案。只需让引擎加载一段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);
屠锐
2023-03-14

JS String基元类型值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”运行时权限,否则它将无法从脚本执行任何Java反射。因此,访问任何Java对象的类对象不会构成任何安全线程。

 类似资料:
  • 这里是HTML文件,在脚本部分,我发出了一个ajax请求,将一些字符串传递给python函数。 在中,我设置了python脚本的路径。Python文件,我希望在该文件中从JS获取所请求的数据并将其打印出来。 注意:这里我没有使用任何框架。只是纯HTML、JS和Python文件。

  • 我通过在我的Java类中调用下面的这个方法加载一个AngularJS页面,只是一个示例。如果我有一个对象,例如人,如何发送到角页面?

  • 问题内容: 当将对象作为参数传递时,JavaScript通过引用传递它们,这使得创建对象的本地副本变得困难。 将有和。 通过克隆可以解决这个问题。简单的例子: 不会或。 题 除了创建本地副本/克隆以外,还有没有更好的方法可以按值传递对象? 问题答案: 并不是的。 根据你的实际需要,一个 可能性 可能是集作为一个新的对象的原型。 因此,您添加到的任何属性都不会添加到中。使用与中的属性相同的属性名称添

  • 问题内容: 这是我的基本功能: 此功能能够连接并在我的数据库上执行查询… 我想创建相同的功能,但更通用。…前一个仅用于一个表(),新表必须能够接受查询的参数作为输入,以及将在其中执行查询的类类型。这将允许我仅使用一行来执行查询。 应该是这样的: 您发现我不知道如何“通用”代码… 我希望已经清楚了… PS 应该是DB()中表的类的代表。 谢谢。 问题答案: 如果您打算返回结果集,请使用:

  • 问题内容: 我正在尝试使用javascript将查询集从Django传递到模板。 我尝试了不同的方法来解决此问题: 1.普通方法-由于命名法[&gt Object:ID&lt,&gt Object:ID&lt,…],Javascript试图解析对象一团糟 Django视图 模板HTML + JS 2. JSON方法-Django无法将对象列表转换为不可序列化的JSON字符串 Django视图 模板

  • 我只想发送数据对象var arrImg中包含的一个字段。我要推送的第一件事是var arrImg的image字段,其条件是checked为true,并将其放入crudData:{'image':[]}上的新数组映像中。然后,第二步,我想在条件为checked为true的情况下,将var arrImg的字段名推送到crudData:{'name':[]}上的新数组名中。选中值首先设置为false,但