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定義了一個(gè)稱為Java的新的全局對(duì)象,它包含許多有用的函數(shù)來使用Java包和類。
Java對(duì)象的 type()
函數(shù)將Java類型導(dǎo)入腳本中。
以下Nashorn代碼導(dǎo)入 java.util.ArrayList
類并創(chuàng)建其對(duì)象:
// 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();
以下代碼導(dǎo)入java.util.ArrayList并調(diào)用它MyList:
var MyList = Java.type("java.util.ArrayList"); var list2 = new MyList();
Rhino JavaScript允許在腳本中使用Java類型的簡(jiǎn)單名稱。
Rhino JavaScript有兩個(gè)內(nèi)置函數(shù)importPackage()和importClass()來分別從包中導(dǎo)入所有類和從包導(dǎo)入類。
Nashorn保留這些函數(shù)。
要在Nashorn中使用這些函數(shù),請(qǐng)使用load()函數(shù)從mozilla_compat.js文件加載兼容性模塊。
以下代碼在上一節(jié)中重寫了以上邏輯這些函數(shù):
load("nashorn:mozilla_compat.js"); importClass(java.util.ArrayList); importPackage(javax.swing); var list = new ArrayList(); var frame = new JFrame("Test");
要使用java.lang包中的類,請(qǐng)導(dǎo)入它或使用Packages或Java全局對(duì)象來使用其完全限定名。
您不能從 java.lang
包中導(dǎo)入所有類。
以下代碼生成錯(cuò)誤,因?yàn)镾tring類名已在JavaScript中定義:
load("nashorn:mozilla_compat.js"); importClass(java.lang.String);
要使用java.lang.String類,請(qǐng)使用其完全限定名。
以下代碼使用內(nèi)置的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頂級(jí)類名不沖突,則可以使用importClass()函數(shù)導(dǎo)入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對(duì)象的類的簡(jiǎn)單名稱。
JavaImporter
是一個(gè)Nashorn函數(shù)對(duì)象,可以用作函數(shù)或構(gòu)造函數(shù)。
它接受Java包和類的列表。您可以如下所示創(chuàng)建JavaImporter對(duì)象。以下代碼顯示了如何從java.lang包導(dǎo)入所有類。
var langPkg = new JavaImporter(Packages.java.lang);
以下代碼顯示了如何從java.lang和java.util包以及javax.swing包中的JFrame類導(dǎo)入所有類。
var pkg2 = JavaImporter(java.lang, java.util, javax.swing.JFrame);
它在第一個(gè)語句中使用 new
運(yùn)算符。第二個(gè)語句不使用 new
運(yùn)算符,它使用JavaImporter作為函數(shù)。 這兩個(gè)語句做同樣的事情。
以下代碼創(chuàng)建一個(gè) JavaImporter
對(duì)象,并在with語句中使用它:
var javaLangAndUtilPkg = JavaImporter(java.lang, java.util); with (javaLangAndUtilPkg) { var list = new ArrayList(); list.add("one"); System.out.println("List is " + list); }
使用帶有構(gòu)造函數(shù)的new運(yùn)算符在腳本中創(chuàng)建一個(gè)新的Java對(duì)象。以下代碼在Nashorn中創(chuàng)建一個(gè)String對(duì)象:
var JavaString = Java.type("java.lang.String"); var hi = new JavaString("Hello");
Nashorn中的以下代碼創(chuàng)建了一個(gè)java.util.Date
對(duì)象,并通過屬性名和方法名訪問對(duì)象的方法。
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);
以下代碼顯示了創(chuàng)建和訪問JavaScript String和Java java.lang.String對(duì)象的長(zhǎng)度之間的差異:
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在編譯時(shí)解析重載方法的方法調(diào)用。
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); } }
腳本語言的解釋器根據(jù)參數(shù)的運(yùn)行時(shí)類型解析重載的方法。
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)
更多建議: