Я использовал носорог для настройки некоторых приложений. Ниже приведен пример функции JavaScript, которая вызывается из Java:
function() {
var phone = this.telephoneNumber;
phone = phone.replace(/[^+0-9]/g,"");
if (phone.indexOf("+") == 0) {
phone = "00" + phone.substring(1);
}
if (phone.indexOf("0041") == 0) {
phone = "0" + phone.substring(4);
}
if (phone.indexOf("0") == 0) {
phone = "0" + phone;
}
return {
Name: this.sn + " " + this.givenName,
firstName: this.givenName || "",
lastName: this.sn || "",
phone: phone,
service: "",
info: ""
};
}
Приложение java может затем получить значения возвращаемого объекта за все, что ему нужно.
Теперь, когда новичок является частью JVM, я бы хотел использовать API скриптов вместо Rhino API, но я не нашел, как получить значения полей объекта JavaScript из Java-кода.
Это свободно связывает язык сценариев, но с оговорками, что функции должны быть названы, а возвращаемый объект должен быть Map (Rhino делает это, но я не уверен в JRuby).
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
engine.eval("function x() { return { foo: 10 } }");
Object o = ((Invocable)engine).invokeFunction("x");
if (o instanceof Map) {
Map m = (Map<Object, Object>)o;
System.out.println(m.get("foo"));
}
или
CompiledScript script = ((Compilable)engine).compile("(function() { return {bar:20} })()");
System.err.println(((Map)script.eval()).get("bar"));
Но вы должны обмануть и вызвать свою функцию, заполнив ее с помощью (...)()
.