一篇文档掌握Jdk8中Javascript引擎Nashorn的使用方法

翻译和编译自: http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/toc.html


用Notepad++新建一js文件。F6执行命令为:

npp_save
cmd.exe /c jjs.exe -fx "$(FULL_CURRENT_PATH)"


代码内容例如以下:

//查看包类型
print(java);
print(java.lang);
print(typeof java.lang);
print(typeof java.lang.System);
print(typeof java.lang.System == 'function');


//创建Java对象
var HashMap = Java.type("java.util.HashMap");
var mapDef = new HashMap();
var map100 = new HashMap(100);
print(Java.type("java.util.Map").Entry);
print('内部类:' + Java.type("java.util.Map$Entry")); //存取内部类


//JavaString測试
var StringCls = Java.type("java.lang.String");
var str = new StringCls("Hello");
str = str.toUpperCase();
print('Upper: ' + str);


//測试输出
Java.type("java.lang.System").out.println(10);
Java.type("java.lang.System").out["println(double)"](10.92929);


//日期
var Date = Java.type('java.util.Date');
var date = new Date();
print('year:' + date.year);
date.year += 1000;
print('new year:' + date.year);


//字符串处理
print("   hehe".trimLeft());            // hehe
print("hehe    ".trimRight() + "he");   // hehehe


//简单函数的定义
function sqr(x) x * x;
print(sqr(3));    // 9


//把不同对象的属性绑定
var o1 = {age: 15};
var o2 = {name: 'bar'};
Object.bindProperties(o1, o2);   //绑定o2到o1上
print('对象的o1属性:' + o1.name + ', ' + o1.age);    //对象的o1属性:bar, 15
print('对象的o2属性:' + o2.name + ', ' + o2.age);    //对象的o2属性:bar, undefined
o1.name = 'BAM';
print('对象的o2属性:' + o2.name);    //BAM


//load命令
load('http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore-min.js');
var odds = _.filter([1, 2, 3, 4, 5, 6], function (num) {
    return num % 2 == 1;
});
print('underscore结果:' + odds);  // 1, 3, 5


//Lamda表达式
var map = Array.prototype.map;
var names = ["john", "jerry", "bob"];
//调用匿名函数。输入參数是names,匿名函数自己主动遍历names的内容name,并计算其长度
var a = map.call(names, function(name) { return name.length() });
print('Lamda表达式:' + a);


//Java数组
var IntArray = Java.type("int[]");
var iarr = new IntArray(10);
iarr[1] = 5;
iarr[2] = 3;
iarr[3] = iarr[1] + iarr[2];
print('5 + 3 = ' + iarr[3]);
print('iarr.length= ' + iarr.length);
print(iarr[0]);
for (var i in iarr) print(i);  //取得索引下标
for each(var i in iarr) print(i); //取得值


//try...catch使用方法
try {
  iarr[10] = 5;
} 
catch (e) {
  print('try...catch...使用方法:' + e.message);
  print(e.lineNumber)
  print(e.columnNumber)
  print(e.fileName)
}


//Java.to实现javascript到java数组类型的转换
var jsVals = ["a", "bc", "de"];
var JString = Java.type("java.lang.String[]");
var jVals = Java.to(jsVals, JString);   


//数据类型转换
var ival = 10;
print(ival.class);
ival = Number(ival);
print(ival.class);


//Java集合使用
var ArrayList = Java.type("java.util.ArrayList");
var list = new ArrayList();
list.add("zhang");
list.add("wang");
for each(var i in list) print(i);


//HashMap
print();
print('HashMap demo');
var HashMap = Java.type("java.util.HashMap");
var hm = new HashMap();
hm.put('zhangsan', 133992);
hm.put('lisi', {name:'martin', sex:'male'});
for each (key in hm.keySet()) print('key: ' + key);
for each (val in hm.values()) print('val: ' + val + ' ' + typeof val);


//存取类及事实上例成员
print('pi:' + Java.type("java.lang.Math").PI);
print('time:' + Java.type("java.lang.System").currentTimeMillis())
print('ok');




//继承和扩展线程类
var Run = Java.type("java.lang.Runnable");
var MyRun = Java.extend(Run, {
    run: function() {
        print("I am running in separate thread");
    }
});
//构造
var Thread = Java.type("java.lang.Thread");
var th = new Thread(new MyRun());
th.run();


var th1 = new Thread(new MyRun());
th1.run();


//super调用父类方法
var SuperRunner = Java.type('java.lang.Thread');
var Runner = Java.extend(SuperRunner);
var runner = new Runner() {
    run: function() {
        Java.super(runner).run();
        print('on my run');
    }
}
runner.run();




//用Javascript定义一个类Dog
function Dog(name) {
  this.name = name;
  this.bark = function() {
    return "Hello, " + this.name;
  }
}


var dog = new Dog("martin");
print("dog bark function: " + dog.bark());


//怎样继承Object类
//from: https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions
/*没模仿成功
var Object = Java.type("java.lang.Object");
var Dog = Java.extend(Object);
var dog = new Dog() {
  bark : function(name) {
    return "hello, " + name;
  }
}
print('狗叫:' + dog.bark('martin'));
*/


//Packages使用方法
var Vector = Packages.java.util.Vector;
// but short-cuts defined for important package prefixes like
//    Packages.java, Packages.javax, Packages.com
//    Packages.edu, Packages.javafx, Packages.org
var JFrame = javax.swing.JFrame;  // javax == Packages.javax
var List = java.util.List;        // java == Packages.java


//exit(1);  //告诉引擎代码运行到这里
//quit(1);




//导入范围---集中一次导入--JavaImporter和with使用方法
var imports = new JavaImporter(java.io, java.lang);
with (imports) {  
    var file = new File(__FILE__);  //查找我在哪里?
    System.out.println('哪里: ' + file.getAbsolutePath());   //内容比較古怪
    // /path/to/my/script.js
}


var CollectionsAndFiles = new JavaImporter(
    java.util,
    java.io,
    java.nio);
with (CollectionsAndFiles) {
  var files = new LinkedHashSet();
  files.add(new File("Plop"));
  files.add(new File("Foo"));
  files.add(new File("w00t.js"));
} 


//__LINE__显示当前代码行数,用于调试比較好
print(__FILE__, __LINE__, __DIR__);


print('JavaFX application');
var Button = javafx.scene.control.Button;
var StackPane = javafx.scene.layout.StackPane;
var Scene = javafx.scene.Scene;


/*仅仅能看到最后的JavaFX应用
function start(primaryStage) {
    primaryStage.title = "Hello World!";
    var button = new Button();
    button.text = "Say 'Hello World'";
    button.onAction = function() print("Hello World!");
    var root = new StackPane();
    root.children.add(button);
    primaryStage.scene = new Scene(root, 300, 250);
    primaryStage.show();
}
*/


//还有一个app--简化版
//但假设前面窗体凝视去掉的话。以下的代码未运行
/*
$STAGE.title = "Hello World!";
var button = new Button();
button.text = "Say 'Hello World 2'";
button.onAction = function() print("Hello World1!");
var root = new StackPane();
root.children.add(button);
$STAGE.scene = new Scene(root, 300, 250);
$STAGE.show();
*/


//为什么窗体代码仅仅运行最后的内容
load("fx:base.js");
load("fx:controls.js");
load("fx:graphics.js");


$STAGE.title = "Hello World!";
var button = new Button();
button.text = "Say 'Hello World 3'";
button.onAction = function() print("Hello World!");
var root = new StackPane();
root.children.add(button);
$STAGE.scene = new Scene(root, 300, 250);
$STAGE.show();


//复杂些的javafx应用---一个动画演示
load("fx:base.js");
load("fx:controls.js");
load("fx:graphics.js");
 
var WIDTH = 500;
var HEIGHT = 600;
var animation;
 
function setup(primaryStage) {
 var root = new Group();
 primaryStage.resizable = false;
 var scene = new Scene(root, WIDTH, HEIGHT);
 scene.title = "Colourful Circles";
 primaryStage.scene = scene;
 
 // create first list of circles
 var layer1 = new Group();
 for(var i = 0; i < 15; i++) {
  var circle = new Circle(200, Color.web("white", 0.05));
  circle.strokeType = StrokeType.OUTSIDE;
  circle.stroke = Color.web("white", 0.2);
  circle.strokeWidth = 4;
  layer1.children.add(circle);
 }
 
 // create second list of circles
 var layer2 = new Group();
 for(var i = 0; i < 20; i++) {
  var circle = new Circle(70, Color.web("white", 0.05));
  circle.strokeType = StrokeType.OUTSIDE;
  circle.stroke = Color.web("white", 0.1);
  circle.strokeWidth = 2;
  layer2.children.add(circle);
 }
 
 // create third list of circles
 var layer3 = new Group();
 for(var i = 0; i < 10; i++) {
  var circle = new Circle(150, Color.web("white", 0.05));
  circle.strokeType = StrokeType.OUTSIDE;
  circle.stroke = Color.web("white", 0.16);
  circle.strokeWidth = 4;
  layer3.children.add(circle);
 }
 
 // set a blur effect on each layer
 layer1.effect = new BoxBlur(30, 30, 3);
 layer2.effect = new BoxBlur(2, 2, 2);
 layer3.effect = new BoxBlur(10, 10, 3);
 
 // create a rectangle size of window with colored gradient
 var colors = new Rectangle(WIDTH, HEIGHT,
   new LinearGradient(0, 1, 1, 0, true, CycleMethod.NO_CYCLE,
      new Stop(0,   Color.web("#f8bd55")),
      new Stop(0.14, Color.web("#c0fe56")),
      new Stop(0.28, Color.web("#5dfbc1")),
      new Stop(0.43, Color.web("#64c2f8")),
      new Stop(0.57, Color.web("#be4af7")),
      new Stop(0.71, Color.web("#ed5fc2")),
      new Stop(0.85, Color.web("#ef504c")),
      new Stop(1,   Color.web("#f2660f"))));
 colors.blendMode = BlendMode.OVERLAY;
 
 // create main content
 var group = new Group(new Rectangle(WIDTH, HEIGHT, Color.BLACK),
        layer1, 
        layer2,
        layer3,
        colors);
 var clip = new Rectangle(WIDTH, HEIGHT);
 clip.smooth = false;
 group.clip = clip;
 root.children.add(group);
 
 // create list of all circles
 var allCircles = new java.util.ArrayList();
 allCircles.addAll(layer1.children);
 allCircles.addAll(layer2.children);
 allCircles.addAll(layer3.children);
 
 // Create a animation to randomly move every circle in allCircles
 animation = new Timeline();
 for each (var circle in allCircles) {
  animation.getKeyFrames().addAll(
     new KeyFrame(Duration.ZERO, // set start position at 0s
         new KeyValue(circle.translateXProperty(), Math.random() * WIDTH),
         new KeyValue(circle.translateYProperty(), Math.random() * HEIGHT)),
     new KeyFrame(new Duration(20000), // set end position at 20s
         new KeyValue(circle.translateXProperty(), Math.random() * WIDTH),
         new KeyValue(circle.translateYProperty(), Math.random() * HEIGHT))
     );
 }
 animation.autoReverse = true;
 animation.cycleCount = Animation.INDEFINITE;
}
 
function stop() {
 animation.stop();
}
 
function play() {
 animation.play();
}
 
function start(primaryStage) {
 setup(primaryStage);
 primaryStage.show();
 play();
}


//JavaFX应用案例
//http://justmy2bits.com/2013/09/08/javafx-with-nashorn-canvas-example/


//编程參考:
//http://www.infoq.com/cn/news/2013/08/everything-about-java-8
//https://wiki.openjdk.java.net/display/Nashorn/Nashorn+Documentation
//https://wiki.openjdk.java.net/display/Nashorn/Main
//https://blogs.oracle.com/nashorn/
//http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/
//http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html
//https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions

JavaFX效果例如以下:


原文地址:https://www.cnblogs.com/cynchanpin/p/6927278.html