Java 脚本语言
Java脚本教程 - Java脚本语言
使用包全局对象
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");
使用Java全局对象
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();
使用importPackage()和importClass()函数
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);
JavaImporter对象
在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); }
在Nashorn中创建Java对象
使用带有构造函数的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方法
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)
更多建议: