177

实战系列之Node.js玩转Java

 6 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzU0OTExNzYwNg%3D%3D&mid=2247483944&idx=1&sn=57f68d4de321a3928c9b2016bbac24df&chksm=fbb589e1ccc200f7912d81ad40385c3a55f5bc2bcfa35e1a10a5aaf863de6f67fff8ea500b2a&scene=0&ke=
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

这些年以来,Node.js的兴起,JavaScript已经从当年的“世界最被误解的语言”变成了“世界最流行的语言”。且其发展之势,从语言本身的进化,库和包的增长,工具支持的完善,star项目和领域解决方案的涌现,平台、技术栈、应用领域的扩张等诸方面来看,都是前所未见的。随着 Node.js服务的普及,对于后端服务是Java的公司就会产生一个问题, Node.js如何与 Java通讯呢?

今天讲什么?

我们抛开架构设计,抛开传统的 http、 socket、 rpc通讯协议,我们聊一聊在 Node.js应用里如何连接 JavaAPI,换句话来说就是在 Node.js里直接写 Java代码。

node-java

Node.js想要和 Java连接,需要一个 node-java 模块。

操作系统:支持 OSX,Linux

运行环境(建议选择):

    • Nodejs LTS 版本 最低要求 6.x

    • java JDK 1.8+

    • Liunx gcc 4.8.1+

  1. $ npm install java

Liunx如果不支持 c++ 11 需要手动升级 gcc 到 gcc 4.8.) 参考地址

如果是 Mac 提示:显示需要安装旧Java SE 6运行环境才能打开,请下载JDK 2015

Node.js 调用 Java

HelloWorld



  1. public class HelloWorld {

  2.  public static void main(String[] args) {

  3.      System.out.println("Hello World!");

  4.  }

  5. }

输出: Hello World!

  • Node.js



  1. const java = require('java')

  2. const javaLangSystem = java.import('java.lang.System')

  3. javaLangSystem.out.printlnSync('Hello World!')

输出: Hello World!

操作Java Map

java 操作 HashMap



  1. import java.util.HashMap;

  2. import java.util.Map;

  3. public class HashMapDemo {

  4.  public static void main(String[] args) {

  5.    Map<String, Object> map = new HashMap<>();

  6.    map.put("name", "SunilWang");

  7.    map.put("age", 20);

  8.    String name = (String) map.get("name");

  9.    int age = (int) map.get("age");

  10.    System.out.printf("name:%s", name);

  11.    System.out.println("");

  12.    System.out.printf("age:%d", age);

  13.  }

  14. }

输出: name:SunilWang age:20

Node.js 同步调用 java HashMap



  1. const java = require('java')

  2. const HashMap = java.import('java.util.HashMap')

  3. // 同步操作

  4. let hashMap = new HashMap()

  5. hashMap.putSync('name', 'SunilWang')

  6. hashMap.putSync('age', 20)

  7. let name = hashMap.getSync('name')

  8. let age = hashMap.getSync('age')

  9. console.log('name', name)

  10. console.log('age', age)

输出: name:SunilWang age:20

Node.js callback 调用 java HashMap



  1. const java = require('java')

  2. const HashMap = java.import('java.util.HashMap')

  3. // callback操作

  4. let hashMap = new HashMap()

  5. hashMap.put('name', 'SunilWang', (error, info) => {

  6.  if (error) console.log('put name Error: ', error)

  7.  hashMap.get('name', (error, name) => {

  8.    if (error) console.log('get name Error: ', error)

  9.    console.log('callback name:%s', name)

  10.  })

  11. })

输出: callback name:SunilWang

Node.js Promise调用 java HashMap



  1. const co = require('co')

  2. const java = require('java')

  3. // 当前配置一定要在顶部声明

  4. java.asyncOptions = {

  5.  syncSuffix: 'Sync', // 同步方法名后缀

  6.  asyncSuffix: '', // 异步方法名后缀

  7.  promiseSuffix: 'Promise', // Promise方法名后缀

  8.  promisify: require('bluebird').promisify // 依赖Promise的模块

  9. }

  10. // ==============

  11. const HashMap = java.import('java.util.HashMap')

  12. // Promise操作

  13. co(function * () {

  14.  let hashMap = new HashMap()

  15.  yield hashMap.putPromise('name', 'SunilWang')

  16.  yield hashMap.putPromise('age', '20')

  17.  let name = yield hashMap.getPromise('name')

  18.  let age = yield hashMap.getPromise('age')

  19.  console.log('name', name)

  20.  console.log('age', age)

  21. })

创建Java 实例两种方法



  1. import java.util.ArrayList;

  2. import java.util.List;

  3. public class ArrayListDemo {

  4.  public static void main(String[] args) {

  5.    List<String> list1 = new ArrayList<>();

  6.    List<String> list2 = new ArrayList<>();

  7.    list1.add("item1");

  8.    list2.add("item1");

  9.    System.out.printf("size: %d", list1.size()); //2

  10.    System.out.println("");

  11.    // list1 equals list2: true

  12.    System.out.printf("list1 equals list2: %s", list1.equals(list2));

  13.  }

  14. }

newInstanceSync



  1. const java = require('java')

  2. let list1 = java.newInstanceSync('java.util.ArrayList')

  3. console.log(list1.sizeSync()) // 0

  4. list1.addSync('item1')

  5. console.log(list1.sizeSync()) // 1

import & new



  1. let ArrayList = java.import('java.util.ArrayList')

  2. let list2 = new ArrayList()

  3. list2.addSync('item1')

  4. let equalValue = list2.equalsSync(list1)

  5. console.log(equalValue)// true

快速new 数据组



  1. public class CharArrayDemo {

  2.  public static void main(String[] args) {

  3.    char [] charArray = "hello world\n".toCharArray();

  4.    // charArray length: 12

  5.    System.out.printf("charArray length: %d", charArray.length);

  6.  }

  7. }

  • Node.js



  1. let charArray = java.newArray('char', 'hello world\n'.split(''))

  2. // [ 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n' ]

  3. console.log(charArray.length) // 12

快速new Long对象



  1. public class LongDemo {

  2.  public static void main(String[] args) {

  3.    Long num = new Long("5");

  4.    System.out.println(num);

  5.    System.out.println(num.longValue());

  6.  }

  7. }

  • Node.js



  1. let javaLong = java.newInstanceSync('java.lang.Long', 5)

  2. // Possibly truncated long value: 5

  3. console.log('Possibly truncated long value: %d', javaLong)

  4. // Original long value (as a string): 5

  5. console.log('Original long value (as a string): %s', javaLong.longValue)

Node.js 调用自己编译类



  1. package com.nearinfinity.nodeJava;

  2. public class MyClass {

  3.  public static int addNumbers(int a, int b) {

  4.    return a + b;

  5.  }

  6. }

  • Node.js



  1. const java = require('java')

  2. java.classpath.push('./src')

  3. let MyClass = java.import('com.nearinfinity.nodeJava.MyClass')

  4. let result = MyClass.addNumbersSync(1, 2)

  5. console.log(result)

  6. let javaInteger = java.newInstanceSync('java.lang.Integer', 2)

  7. // 快速调用 Java 静态类里面的方法

  8. result = java.callStaticMethodSync('com.nearinfinity.nodeJava.MyClass', 'addNumbers', javaInteger, 3)

  9. console.log(result)

上述方法只是带你了解 node-java冰山一角, node-java API很丰富,如 jvm, 实例一个类, 调用类静态方法, 快速实例化一个对象等等。

最快的学习方式是看文档,文档地址:node-java 。

——————————————————

长按二维码,关注大转转FE

Image

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK