Java 腳本語言

2018-03-18 13:52 更新

Java腳本教程 - Java腳本語言

使用包全局對(duì)象

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全局對(duì)象

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();

使用importPackage()和importClass()函數(shù)

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);

JavaImporter對(duì)象

在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);
}

在Nashorn中創(chuàng)建Java對(duì)象

使用帶有構(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方法

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)
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)