В Java 7 (1,7), я мог бы получить доступ к методу Java с JavaScript, запустив это:Nashorn доступ нестатического метод Java
ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
jse.eval("importClass(net.apocalypselabs.symat.Functions);");
jse.eval("SyMAT_Functions = new net.apocalypselabs.symat.Functions();");
String input = "notify(\"Foo\");"; // This is user input
jse.eval("with(SyMAT_Functions){ "+input+" }");
Что бы запустить функцию Notify() из класса функций Java:
public class Functions {
private Object someObjectThatCannotBeStatic;
public void notify(Object message) {
JOptionPane.showMessageDialog(null, message.toString());
}
/* Lots more functions in here, several working with the same non-static variable */
}
Как получить доступ к классу функций в Java 1.8 с помощью механизма Nashorn? Моя цель - запустить другой код для первого фрагмента, если у пользователя есть Java 1.8, в то же время позволяя пользователям с 1.7 использовать приложение.
Я пробовал http://www.doublecloud.org/2014/04/java-8-new-features-nashorn-javascript-engine/, https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/api.html и How to instantiate a Java class in JavaScript using Nashorn? без везения. Ни один из них, похоже, не позволяет мне делать то же самое, что и Java 1.7, вместо этого предполагая, что я хочу получить доступ к статическим функциям и объектам.
Самая распространенная ошибка, я получаю:
Я начинаю с ...
ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
jse.eval("var SyMAT_Functions;with (new JavaImporter(Packages.net.apocalypselabs.symat)) {"
+ "SyMAT_Functions = new Functions();}");
... потом ...
jse.eval("with(SyMAT_Functions){ "+input+" }");
... выплевывает ...
TypeError: Cannot apply "with" to non script object in <eval> at line number 1
Что не работает в Java 8? Есть ли сообщение об ошибке или трассировка стека, которую вы можете включить? –
@WilliamPrice Ошибки изменяются в зависимости от метода, который я пытаюсь использовать. Моя проблема в том, что я не могу получить доступ к нестационарным методам в Java 8, как бы я ни старался. –
@WilliamPrice Хорошо, я отредактировал одну из моих попыток и то, что меня достало. Я пробовал все разные методы, приведенные в этих ссылках, если я правильно помню, все они дали мне, что «TypeError» после того, как они возились с ними. –