2016-05-24 2 views
1

Используя ScriptEngine и Bindings, кажется, что он обрабатывает переменные, входящие в строку Java, вместо строк JavaScript. Языки имеют функции-члены с идентичными сигнатурами, но отличаются поведением, и это создает довольно путаницу при написании сценариев. Я хотел бы, чтобы функции Java не были доступны, передавая привязки, как если бы они были строковыми литералами JavaScript, заставляя использовать только функции JavaScript.Как передать строки JavaScript в движок Nashorn вместо Java Strings?

Я попытался использовать аргумент --no-java, который он принимает, но, похоже, не делает того, что, как я думал. Я также пробовал использовать ClassFilter для выполнения того же, безрезультатно.

В приведенном ниже примере я хотел бы получить исключение для неопределенного метода (replaceAll только в Java, а не в JavaScript). Вместо этого он печатает Qonald Quck.

package test; 

import javax.script.Bindings; 
import javax.script.ScriptEngine; 
import javax.script.ScriptException; 

import jdk.nashorn.api.scripting.NashornScriptEngineFactory; 
import jdk.nashorn.api.scripting.ClassFilter; 

public class TestScripting { 

    public static void main(String[] args) throws ScriptException { 

     System.getProperties().setProperty("nashorn.args", "--no-java"); 
     NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); 
     ScriptEngine jsEngine = factory.getScriptEngine(new ClassFilter() { 

      @Override 
      public boolean exposeToScripts(String arg0) { 
       return false; 
      } 
     }); 

     Bindings bindings = jsEngine.createBindings(); 
     bindings.put("MyString", "Donald Duck"); 

     String res = (String) jsEngine.eval("MyString.replaceAll('D','Q')", 
       bindings); 
     System.out.println(res); 
    } 
} 
+0

Когда вы используете 'bindings.put', вы выставляете объект Java, который является строкой. Вы считали, что 'jsEngine.eval (" var MyString = \ "Donald Duck \"); ")' – matt

ответ

0

Правда состоит в том, что внутренне Nashorn использует java.lang.String для представления JavaScript примитивного типа string. Однако, поскольку мы полагали, что некоторые люди будут раздражаться, если они не смогут использовать методы Java String, мы также разрешаем это. (То же самое лечение идет на java.lang.Boolean, java.lang.Integer и java.lang.Double которые также внутреннее представление JS примитивных типов boolean и number.)

Представляется целесообразным, однако, что --no-java следует отключить эту функцию. I filed this as an issue.

+0

Это полностью отвечает на мой вопрос. Спасибо! – Aaron

Смежные вопросы