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

用Notepad++新建一js文件,F6运行命令为:

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


代码内容如下:

[javascript]  view plain  copy
  1. //查看包类型  
  2. print(java);  
  3. print(java.lang);  
  4. print(typeof java.lang);  
  5. print(typeof java.lang.System);  
  6. print(typeof java.lang.System == 'function');  
  7.   
  8.   
  9. //创建Java对象  
  10. var HashMap = Java.type("java.util.HashMap");  
  11. var mapDef = new HashMap();  
  12. var map100 = new HashMap(100);  
  13. print(Java.type("java.util.Map").Entry);  
  14. print('内部类:' + Java.type("java.util.Map$Entry")); //存取内部类  
  15.   
  16.   
  17. //JavaString测试  
  18. var StringCls = Java.type("java.lang.String");  
  19. var str = new StringCls("Hello");  
  20. str = str.toUpperCase();  
  21. print('Upper: ' + str);  
  22.   
  23.   
  24. //测试输出  
  25. Java.type("java.lang.System").out.println(10);  
  26. Java.type("java.lang.System").out["println(double)"](10.92929);  
  27.   
  28.   
  29. //日期  
  30. var Date = Java.type('java.util.Date');  
  31. var date = new Date();  
  32. print('year:' + date.year);  
  33. date.year += 1000;  
  34. print('new year:' + date.year);  
  35.   
  36.   
  37. //字符串处理  
  38. print("   hehe".trimLeft());            // hehe  
  39. print("hehe    ".trimRight() + "he");   // hehehe  
  40.   
  41.   
  42. //简单函数的定义  
  43. function sqr(x) x * x;  
  44. print(sqr(3));    // 9  
  45.   
  46.   
  47. //把不同对象的属性绑定  
  48. var o1 = {age: 15};  
  49. var o2 = {name: 'bar'};  
  50. Object.bindProperties(o1, o2);   //绑定o2到o1上  
  51. print('对象的o1属性:' + o1.name + ', ' + o1.age);    //对象的o1属性:bar, 15  
  52. print('对象的o2属性:' + o2.name + ', ' + o2.age);    //对象的o2属性:bar, undefined  
  53. o1.name = 'BAM';  
  54. print('对象的o2属性:' + o2.name);    //BAM  
  55.   
  56.   
  57. //load命令  
  58. load('http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore-min.js');  
  59. var odds = _.filter([1, 2, 3, 4, 5, 6], function (num) {  
  60.     return num % 2 == 1;  
  61. });  
  62. print('underscore结果:' + odds);  // 1, 3, 5  
  63.   
  64.   
  65. //Lamda表达式  
  66. var map = Array.prototype.map;  
  67. var names = ["john""jerry""bob"];  
  68. //调用匿名函数,输入参数是names,匿名函数自动遍历names的内容name,并计算其长度  
  69. var a = map.call(names, function(name) { return name.length() });  
  70. print('Lamda表达式:' + a);  
  71.   
  72.   
  73. //Java数组  
  74. var IntArray = Java.type("int[]");  
  75. var iarr = new IntArray(10);  
  76. iarr[1] = 5;  
  77. iarr[2] = 3;  
  78. iarr[3] = iarr[1] + iarr[2];  
  79. print('5 + 3 = ' + iarr[3]);  
  80. print('iarr.length= ' + iarr.length);  
  81. print(iarr[0]);  
  82. for (var i in iarr) print(i);  //取得索引下标  
  83. for each(var i in iarr) print(i); //取得值  
  84.   
  85.   
  86. //try...catch用法  
  87. try {  
  88.   iarr[10] = 5;  
  89. }   
  90. catch (e) {  
  91.   print('try...catch...用法:' + e.message);  
  92.   print(e.lineNumber)  
  93.   print(e.columnNumber)  
  94.   print(e.fileName)  
  95. }  
  96.   
  97.   
  98. //Java.to实现javascript到java数组类型的转换  
  99. var jsVals = ["a""bc""de"];  
  100. var JString = Java.type("java.lang.String[]");  
  101. var jVals = Java.to(jsVals, JString);     
  102.   
  103.   
  104. //数据类型转换  
  105. var ival = 10;  
  106. print(ival.class);  
  107. ival = Number(ival);  
  108. print(ival.class);  
  109.   
  110.   
  111. //Java集合使用  
  112. var ArrayList = Java.type("java.util.ArrayList");  
  113. var list = new ArrayList();  
  114. list.add("zhang");  
  115. list.add("wang");  
  116. for each(var i in list) print(i);  
  117.   
  118.   
  119. //HashMap  
  120. print();  
  121. print('HashMap demo');  
  122. var HashMap = Java.type("java.util.HashMap");  
  123. var hm = new HashMap();  
  124. hm.put('zhangsan', 133992);  
  125. hm.put('lisi', {name:'martin', sex:'male'});  
  126. for each (key in hm.keySet()) print('key: ' + key);  
  127. for each (val in hm.values()) print('val: ' + val + ' ' + typeof val);  
  128.   
  129.   
  130. //存取类及其实例成员  
  131. print('pi:' + Java.type("java.lang.Math").PI);  
  132. print('time:' + Java.type("java.lang.System").currentTimeMillis())  
  133. print('ok');  
  134.   
  135.   
  136.   
  137.   
  138. //继承和扩展线程类  
  139. var Run = Java.type("java.lang.Runnable");  
  140. var MyRun = Java.extend(Run, {  
  141.     run: function() {  
  142.         print("I am running in separate thread");  
  143.     }  
  144. });  
  145. //构造  
  146. var Thread = Java.type("java.lang.Thread");  
  147. var th = new Thread(new MyRun());  
  148. th.run();  
  149.   
  150.   
  151. var th1 = new Thread(new MyRun());  
  152. th1.run();  
  153.   
  154.   
  155. //super调用父类方法  
  156. var SuperRunner = Java.type('java.lang.Thread');  
  157. var Runner = Java.extend(SuperRunner);  
  158. var runner = new Runner() {  
  159.     run: function() {  
  160.         Java.super(runner).run();  
  161.         print('on my run');  
  162.     }  
  163. }  
  164. runner.run();  
  165.   
  166.   
  167.   
  168.   
  169. //用Javascript定义一个类Dog  
  170. function Dog(name) {  
  171.   this.name = name;  
  172.   this.bark = function() {  
  173.     return "Hello, " + this.name;  
  174.   }  
  175. }  
  176.   
  177.   
  178. var dog = new Dog("martin");  
  179. print("dog bark function: " + dog.bark());  
  180.   
  181.   
  182. //如何继承Object类  
  183. //from: https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions  
  184. /*没模仿成功 
  185. var Object = Java.type("java.lang.Object"); 
  186. var Dog = Java.extend(Object); 
  187. var dog = new Dog() { 
  188.   bark : function(name) { 
  189.     return "hello, " + name; 
  190.   } 
  191. } 
  192. print('狗叫:' + dog.bark('martin')); 
  193. */  
  194.   
  195.   
  196. //Packages用法  
  197. var Vector = Packages.java.util.Vector;  
  198. // but short-cuts defined for important package prefixes like  
  199. //    Packages.java, Packages.javax, Packages.com  
  200. //    Packages.edu, Packages.javafx, Packages.org  
  201. var JFrame = javax.swing.JFrame;  // javax == Packages.javax  
  202. var List = java.util.List;        // java == Packages.java  
  203.   
  204.   
  205. //exit(1);  //告诉引擎代码执行到这里  
  206. //quit(1);  
  207.   
  208.   
  209.   
  210.   
  211. //导入范围---集中一次导入--JavaImporter和with用法  
  212. var imports = new JavaImporter(java.io, java.lang);  
  213. with (imports) {    
  214.     var file = new File(__FILE__);  //查找我在哪里?  
  215.     System.out.println('哪里: ' + file.getAbsolutePath());   //内容比较古怪  
  216.     // /path/to/my/script.js  
  217. }  
  218.   
  219.   
  220. var CollectionsAndFiles = new JavaImporter(  
  221.     java.util,  
  222.     java.io,  
  223.     java.nio);  
  224. with (CollectionsAndFiles) {  
  225.   var files = new LinkedHashSet();  
  226.   files.add(new File("Plop"));  
  227.   files.add(new File("Foo"));  
  228.   files.add(new File("w00t.js"));  
  229. }   
  230.   
  231.   
  232. //__LINE__显示当前代码行数,用于调试比较好  
  233. print(__FILE__, __LINE__, __DIR__);  
  234.   
  235.   
  236. print('JavaFX application');  
  237. var Button = javafx.scene.control.Button;  
  238. var StackPane = javafx.scene.layout.StackPane;  
  239. var Scene = javafx.scene.Scene;  
  240.   
  241.   
  242. /*只能看到最后的JavaFX应用 
  243. function start(primaryStage) { 
  244.     primaryStage.title = "Hello World!"; 
  245.     var button = new Button(); 
  246.     button.text = "Say 'Hello World'"; 
  247.     button.onAction = function() print("Hello World!"); 
  248.     var root = new StackPane(); 
  249.     root.children.add(button); 
  250.     primaryStage.scene = new Scene(root, 300, 250); 
  251.     primaryStage.show(); 
  252. } 
  253. */  
  254.   
  255.   
  256. //另一个app--简化版  
  257. //但如果前面窗口注释去掉的话,下面的代码未执行  
  258. /* 
  259. $STAGE.title = "Hello World!"; 
  260. var button = new Button(); 
  261. button.text = "Say 'Hello World 2'"; 
  262. button.onAction = function() print("Hello World1!"); 
  263. var root = new StackPane(); 
  264. root.children.add(button); 
  265. $STAGE.scene = new Scene(root, 300, 250); 
  266. $STAGE.show(); 
  267. */  
  268.   
  269.   
  270. //为什么窗口代码只执行最后的内容  
  271. load("fx:base.js");  
  272. load("fx:controls.js");  
  273. load("fx:graphics.js");  
  274.   
  275.   
  276. $STAGE.title = "Hello World!";  
  277. var button = new Button();  
  278. button.text = "Say 'Hello World 3'";  
  279. button.onAction = function() print("Hello World!");  
  280. var root = new StackPane();  
  281. root.children.add(button);  
  282. $STAGE.scene = new Scene(root, 300, 250);  
  283. $STAGE.show();  
  284.   
  285.   
  286. //复杂些的javafx应用---一个动画演示  
  287. load("fx:base.js");  
  288. load("fx:controls.js");  
  289. load("fx:graphics.js");  
  290.    
  291. var WIDTH = 500;  
  292. var HEIGHT = 600;  
  293. var animation;  
  294.    
  295. function setup(primaryStage) {  
  296.  var root = new Group();  
  297.  primaryStage.resizable = false;  
  298.  var scene = new Scene(root, WIDTH, HEIGHT);  
  299.  scene.title = "Colourful Circles";  
  300.  primaryStage.scene = scene;  
  301.    
  302.  // create first list of circles  
  303.  var layer1 = new Group();  
  304.  for(var i = 0; i < 15; i++) {  
  305.   var circle = new Circle(200, Color.web("white", 0.05));  
  306.   circle.strokeType = StrokeType.OUTSIDE;  
  307.   circle.stroke = Color.web("white", 0.2);  
  308.   circle.strokeWidth = 4;  
  309.   layer1.children.add(circle);  
  310.  }  
  311.    
  312.  // create second list of circles  
  313.  var layer2 = new Group();  
  314.  for(var i = 0; i < 20; i++) {  
  315.   var circle = new Circle(70, Color.web("white", 0.05));  
  316.   circle.strokeType = StrokeType.OUTSIDE;  
  317.   circle.stroke = Color.web("white", 0.1);  
  318.   circle.strokeWidth = 2;  
  319.   layer2.children.add(circle);  
  320.  }  
  321.    
  322.  // create third list of circles  
  323.  var layer3 = new Group();  
  324.  for(var i = 0; i < 10; i++) {  
  325.   var circle = new Circle(150, Color.web("white", 0.05));  
  326.   circle.strokeType = StrokeType.OUTSIDE;  
  327.   circle.stroke = Color.web("white", 0.16);  
  328.   circle.strokeWidth = 4;  
  329.   layer3.children.add(circle);  
  330.  }  
  331.    
  332.  // set a blur effect on each layer  
  333.  layer1.effect = new BoxBlur(30, 30, 3);  
  334.  layer2.effect = new BoxBlur(2, 2, 2);  
  335.  layer3.effect = new BoxBlur(10, 10, 3);  
  336.    
  337.  // create a rectangle size of window with colored gradient  
  338.  var colors = new Rectangle(WIDTH, HEIGHT,  
  339.    new LinearGradient(0, 1, 1, 0, true, CycleMethod.NO_CYCLE,  
  340.       new Stop(0,   Color.web("#f8bd55")),  
  341.       new Stop(0.14, Color.web("#c0fe56")),  
  342.       new Stop(0.28, Color.web("#5dfbc1")),  
  343.       new Stop(0.43, Color.web("#64c2f8")),  
  344.       new Stop(0.57, Color.web("#be4af7")),  
  345.       new Stop(0.71, Color.web("#ed5fc2")),  
  346.       new Stop(0.85, Color.web("#ef504c")),  
  347.       new Stop(1,   Color.web("#f2660f"))));  
  348.  colors.blendMode = BlendMode.OVERLAY;  
  349.    
  350.  // create main content  
  351.  var group = new Group(new Rectangle(WIDTH, HEIGHT, Color.BLACK),  
  352.         layer1,   
  353.         layer2,  
  354.         layer3,  
  355.         colors);  
  356.  var clip = new Rectangle(WIDTH, HEIGHT);  
  357.  clip.smooth = false;  
  358.  group.clip = clip;  
  359.  root.children.add(group);  
  360.    
  361.  // create list of all circles  
  362.  var allCircles = new java.util.ArrayList();  
  363.  allCircles.addAll(layer1.children);  
  364.  allCircles.addAll(layer2.children);  
  365.  allCircles.addAll(layer3.children);  
  366.    
  367.  // Create a animation to randomly move every circle in allCircles  
  368.  animation = new Timeline();  
  369.  for each (var circle in allCircles) {  
  370.   animation.getKeyFrames().addAll(  
  371.      new KeyFrame(Duration.ZERO, // set start position at 0s  
  372.          new KeyValue(circle.translateXProperty(), Math.random() * WIDTH),  
  373.          new KeyValue(circle.translateYProperty(), Math.random() * HEIGHT)),  
  374.      new KeyFrame(new Duration(20000), // set end position at 20s  
  375.          new KeyValue(circle.translateXProperty(), Math.random() * WIDTH),  
  376.          new KeyValue(circle.translateYProperty(), Math.random() * HEIGHT))  
  377.      );  
  378.  }  
  379.  animation.autoReverse = true;  
  380.  animation.cycleCount = Animation.INDEFINITE;  
  381. }  
  382.    
  383. function stop() {  
  384.  animation.stop();  
  385. }  
  386.    
  387. function play() {  
  388.  animation.play();  
  389. }  
  390.    
  391. function start(primaryStage) {  
  392.  setup(primaryStage);  
  393.  primaryStage.show();  
  394.  play();  
  395. }  
  396.   
  397.   
  398. //JavaFX应用案例  
  399. //http://justmy2bits.com/2013/09/08/javafx-with-nashorn-canvas-example/  
  400.   
  401.   
  402. //编程参考:  
  403. //http://www.infoq.com/cn/news/2013/08/everything-about-java-8  
  404. //https://wiki.openjdk.java.net/display/Nashorn/Nashorn+Documentation  
  405. //https://wiki.openjdk.java.net/display/Nashorn/Main  
  406. //https://blogs.oracle.com/nashorn/  
  407. //http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/  
  408. //http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html  
  409. //https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions  

JavaFX效果如下:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值