Java 脚本语言

2018-03-18 13:52 更新

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)
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号