Nashorn将所有Java包都定义为名为 Packages
的全局变量的属性。
例如, java.lang
和 javax.swing
包可以称为 Packages.java.lang
和 Packages.javax.swing
。
以下代码在Nashorn中使用 java.util.List
和javax.swing.JFrame
:
// Create a List
var list1 = new Packages.java.util.ArrayList();
// Create a JFrame
var frame1 = new Packages.javax.swing.JFrame("Test");
Nashorn将 java,javax,org,com,edu
和 net
声明为全局变量,分别是 Packages.java Packages.javax Packages.org Packages.com Packages.edu
和 Packages.net
的别名。
以下代码使用 Packages.java
和 Packages.javax
的 java
和 javax
别名:
// Create a List
var list = new java.util.ArrayList();
// Create a JFrame
var frame = new javax.swing.JFrame("Test");
Nashorn定义了一个称为Java的新的全局对象,它包含许多有用的函数来使用Java包和类。
Java对象的 type()
函数将Java类型导入脚本中。
以下Nashorn代码导入 java.util.ArrayList
类并创建其对象:
// Import java.util.ArrayList type and call it ArrayList
var ArrayList = Java.type("java.util.ArrayList");
// Create an object of the ArrayList type
var list = new ArrayList();
以下代码导入java.util.ArrayList并调用它MyList:
var MyList = Java.type("java.util.ArrayList");
var list2 = new MyList();
Rhino JavaScript允许在脚本中使用Java类型的简单名称。
Rhino JavaScript有两个内置函数importPackage()和importClass()来分别从包中导入所有类和从包导入类。
Nashorn保留这些函数。
要在Nashorn中使用这些函数,请使用load()函数从mozilla_compat.js文件加载兼容性模块。
以下代码在上一节中重写了以上逻辑这些函数:
load("nashorn:mozilla_compat.js");
importClass(java.util.ArrayList);
importPackage(javax.swing);
var list = new ArrayList();
var frame = new JFrame("Test");
要使用java.lang包中的类,请导入它或使用Packages或Java全局对象来使用其完全限定名。
您不能从 java.lang
包中导入所有类。
以下代码生成错误,因为String类名已在JavaScript中定义:
load("nashorn:mozilla_compat.js");
importClass(java.lang.String);
要使用java.lang.String类,请使用其完全限定名。
以下代码使用内置的JavaScript String类和java.lang.String类:
var javaStr = new java.lang.String("Hello"); // Java String class
var jsStr = new String("Hello"); // JavaScript String class
如果java.lang包中的类名与JavaScript顶级类名不冲突,则可以使用importClass()函数导入Java类。
例如,您可以使用以下代码段来使用java.lang.System类:
load("nashorn:mozilla_compat.js");
importClass(java.lang.System);
var jsStr = new String("Hello");
System.out.println(jsStr);
在JavaScript中,可以在with语句中使用JavaImporter对象的类的简单名称。
JavaImporter
是一个Nashorn函数对象,可以用作函数或构造函数。
它接受Java包和类的列表。您可以如下所示创建JavaImporter对象。以下代码显示了如何从java.lang包导入所有类。
var langPkg = new JavaImporter(Packages.java.lang);
以下代码显示了如何从java.lang和java.util包以及javax.swing包中的JFrame类导入所有类。
var pkg2 = JavaImporter(java.lang, java.util, javax.swing.JFrame);
它在第一个语句中使用 new
运算符。第二个语句不使用 new
运算符,它使用JavaImporter作为函数。 这两个语句做同样的事情。
以下代码创建一个 JavaImporter
对象,并在with语句中使用它:
var javaLangAndUtilPkg = JavaImporter(java.lang, java.util);
with (javaLangAndUtilPkg) {
var list = new ArrayList();
list.add("one");
System.out.println("List is " + list);
}
使用带有构造函数的new运算符在脚本中创建一个新的Java对象。以下代码在Nashorn中创建一个String对象:
var JavaString = Java.type("java.lang.String");
var hi = new JavaString("Hello");
Nashorn中的以下代码创建了一个java.util.Date
对象,并通过属性名和方法名访问对象的方法。
var LocalDate = Java.type("java.time.LocalDate");
var dt = LocalDate.now();
var year = dt.year; // Use as a property
var month = dt.month; // Use as a property
var date = dt.getDayOfMonth(); // Use as a method
print("Date:" + dt);
print("Year:" + year + ", Month:" + month + ", Day:" + date);
以下代码显示了创建和访问JavaScript String和Java java.lang.String对象的长度之间的差异:
var jsStr = new String("Hello JavaScript String");
print("JavaScript String: " + jsStr);
print("JavaScript String Length: " + jsStr.length);
// Java String
var javaStr = new java.lang.String("Hello Java String");
print("Java String: " + javaStr);
print("Java String Length: " + javaStr.length());
Java在编译时解析重载方法的方法调用。
public class Printer {
public void print(String str) {
System.out.println("print(String): " + str);
}
public void print(Object obj) {
System.out.println("print(Object): " + obj);
}
public void print(Double num) {
System.out.println("print(Double): " + num);
}
}
脚本语言的解释器根据参数的运行时类型解析重载的方法。
var Printer = Java.type("Printer");
var pt = new Printer();
var list = ["Hello", new Object(), 1.5];
for each(var element in list) {
pt.print(element);
}
JavaScript可以选择特定版本的重载方法。
var Printer = Java.type("Printer");
var pt = new Printer();
pt["print(java.lang.Object)"](10.5); // Calls print(Object)
pt["print(java.lang.Double)"](10.5); // Calls print(Double)
© 著作权归作者所有