一篇文档掌握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效果例如以下:
一篇文档掌握Jdk8中Javascript引擎Nashorn的使用方法的更多相关文章
- ASP.NET4.0中JavaScript脚本调用Web Service 方法
环境:VS2019 .net 4.0 framework 根据教材使用ScriptManager在JavaScript中调用Web service 时,失败.现将过程和解决方法记录如下: 1.定义W ...
- MYSQL在线注释文档--- 在gdb中显示源码(gdbtui使用方法)----赖明星的个人博客
http://mingxinglai.com/cn/2013/07/gdbtui/ MySQL源码注释与类图 http://mingxinglai.com/cn/2015/08/mysql-annot ...
- JavaScript引擎基本原理: 优化prototypes
原文链接: JavaScript engine fundamentals: optimizing prototypes 这篇文章介绍了一些JavaScript引擎常用的优化关键点, 并不只是Bened ...
- 【深度思考】JDK8中日期类型该如何使用?
在JDK8之前,处理日期时间,我们主要使用3个类,Date.SimpleDateFormat和Calendar. 这3个类在使用时都或多或少的存在一些问题,比如SimpleDateFormat不是线程 ...
- JavaScript之call()和apply()方法详解
简介:apply()和call()都是属于Function.prototype的一个方法属性,它是JavaScript引擎内在实现的方法,因为属于Function.prototype,所以每个Func ...
- java 11 移除的一些其他内容,更简化的编译运行程序,Unicode 10,移除了不太使用的JavaEE模块和CORBA技术,废除Nashorn javascript引擎,不建议使用Pack200 相关api
移除的一些其他内容 移除项 移除了com.sun.awt.AWTUtilities 移除了sun.misc.Unsafe.defineClass, 使用java.lang.invoke.MethodH ...
- 《浏览器工作原理与实践》<10>作用域链和闭包 :代码中出现相同的变量,JavaScript引擎是如何选择的?
在上一篇文章中我们讲到了什么是作用域,以及 ES6 是如何通过变量环境和词法环境来同时支持变量提升和块级作用域,在最后我们也提到了如何通过词法环境和变量环境来查找变量,这其中就涉及到作用域链的概念. ...
- Java8 Nashorn JavaScript引擎
使用Java8,Nashorn大大提高了JavaScript 引擎引入,以取代现有的Nashorn Java脚本引擎.Nashorn提供2至10倍更好的性能,因为它直接编译代码在存储器,并传递到字节码 ...
- 一篇文章带你了解JavaScript中的语法,数据类型,流程控制语句以及函数
作者 | Jeskson 来源 | 达达前端小酒馆 1 JavaScript有多重要啊,才能让我说说一下,其中的语法,操作符,数据类型,内置功能等. 语法: 在JavaScript中的变量,函数名和操 ...
随机推荐
- 【POJ 3074】 Sudoku
[题目链接] http://poj.org/problem?id=3074 [算法] 将数独问题转化为精确覆盖问题,用Dancing Links求解 转化方法如下 : 我们知道,在一个数独中 : 1. ...
- ortp库使用入门
我们知道, RTP(Real-timeTransportProtocol)是用于Internet上针对多媒体数据流的一种传输协议,做流媒体传输方面的应用离不开RTP协议的实现及使用,为了更加快速地在项 ...
- E20170816-mk
deque 即双端队列.是一种具有队列和栈的性质的数据结构. revert vi. 恢复; 重提; 回到…上; <律>归还; n. 归属; 恢复原来信仰的人; Indicator ...
- Eqs(枚举+ hash)
http://poj.org/problem?id=1840 题意:给出系数a1,a2,a3,a4,a5,求满足方程的解有多少组. 思路:有a1x13+ a2x23+ a3x33+ a4x43+ a5 ...
- 【BZOJ4555】【TJOI2016】【HEOI2016】求和
题目 传送门 解法 我们可以用容斥来求第二类斯特林数 我们知道, 第二类斯特林数\(S(n, k)\)是\(n\)个元素放进\(k\)个无标号的盒子里, 不可以含有空的. 于是我们可以考虑可以含有空的 ...
- java selenium启动火狐浏览器报错:Cannot find firefox binary in PATH. Make sure firefox is installed. OS appears to be: VISTA Build info: version: '3.8.1', revision: '6e95a6684b', time: '2017-12-01T19:05:14.666Z
Cannot find firefox binary in PATH. Make sure firefox is installed. OS appears to be: VISTA Build in ...
- Spring Boot (7) JdbcTemplate访问数据库
使用jdbcTemplate操作数据库 spring framework对数据库的操作在jdbc上面做了深层次的封装,通过依赖注入功能,可以将datasource注册到jdbcTemplate中,学习 ...
- 自学Python十一 Python爬虫总结
通过几天的学习与尝试逐渐对python爬虫有了一些小小的心得,我们渐渐发现他们有很多共性,总是要去获取一系列的链接,读取网页代码,获取所需内容然后重复上面的工作,当自己运用的越来越熟练之后我们就会尝试 ...
- Windows-Server-2008、IIS7.0环境下配置伪静态化
在Windows-Server-2008.IIS7.0环境下配置伪静态化 首先,是IIS7.0的配置,由于Windows Server 2008操作系统默认的IIS版本为 ...
- Java_Web之宠物管理系统
使用JSP+servLet实现宠物管理系统,oraC1e11g作为后台数据厍,实现查看宠物和增加宠物的功能由你实现,如图: 其中宠物包栝:狗.猫.鸟.鼠 具体要求及推荐实现步骤 第一步:创建数据库代码 ...