如何使用Nashorn引擎调用Java对象

时间:2018-09-19 06:47:41

标签: java nashorn

我想使用Nashorn控制台替代Rails c。例如,我想调用Java方法从远程系统导入数据并执行数据迁移。我发现这很有趣:

https://www.baeldung.com/java-nashorn

$JAVA_HOME/bin/jjs
jjs> print("test"); 
test
jjs> 

例如,如何从部署在Wildfly服务器上的WAR包中调用某些Java方法并传递一些参数?

您可以提出更好的选择吗?

3 个答案:

答案 0 :(得分:3)

请参阅Oracle的“ Java脚本程序员指南”第3章“ Using Java From Scripts”:

  

要从JavaScript访问原始和引用Java类型,请调用Java.type()函数,该函数返回一个类型对象,该对象与作为字符串传入的类的全名相对应。下面的示例向您展示如何获取各种类型的对象:

var ArrayList = Java.type("java.util.ArrayList");
var intType = Java.type("int");
var StringArrayType = Java.type("java.lang.String[]");
var int2DArrayType = Java.type("int[][]");
     

由Java.type()函数返回的类型对象可以在JavaScript代码中使用,类似于在Java中使用类名的方式。例如,您可以使用它实例化新对象,如下所示:

var anArrayList = new Java.type("java.util.ArrayList");

尽管您的问题对您要尝试执行的操作有点含糊。如果您在应用程序中使用Nashorn,则使用该脚本执行的脚本将有权访问应用程序执行的Java类。

答案 1 :(得分:2)

来自Nashorn tutorial

Java:

package com.stackoverflow;
public class Foo {
 public static String bar(String name) {
    System.out.format("Hi there from Java, %s", name);
    return "greetings from java";
 }
}

JavaScript:

var javaFooClazz = Java.type('com.stackoverflow.Foo');
var result =javaFooClazz.bar('John Doe');
print(result);

答案 2 :(得分:1)

因为nashorn在Java 11中已弃用,所以我建议使用Groovy作为脚本语言。它类似于Java,并且受spring框架的支持-如果不能使用javascript的话。否则,您应该关注Java领域的讨论-也许GraalVM将是Java的下一个JavaScript引擎-另外我还了解到它们正在Nashorn上运行-因此,目前在这里还不确定未来。