實戰(zhàn)系列之 Node.js 玩轉(zhuǎn) Java

這些年以來卑雁,Node.js的興起拓售,JavaScript已經(jīng)從當年的“世界最被誤解的語言”變成了“世界最流行的語言”窥摄。且其發(fā)展之勢,從語言本身的進化础淤,庫和包的增長崭放,工具支持的完善,star項目和領(lǐng)域解決方案的涌現(xiàn)鸽凶,平臺币砂、技術(shù)棧、應(yīng)用領(lǐng)域的擴張等諸方面來看玻侥,都是前所未見的决摧。隨著 Node.js
服務(wù)的普及,對于后端服務(wù)是Java的公司就會產(chǎn)生一個問題, Node.js
如何與 Java
通訊呢蜜徽?
今天講什么祝懂?
我們拋開架構(gòu)設(shè)計,拋開傳統(tǒng)的 http 拘鞋、 socket砚蓬、 rpc
通訊協(xié)議,我們聊一聊在 Node.js
應(yīng)用里如何連接 Java API盆色,換句話來說就是在 Node.js里直接寫 Java代碼灰蛙。
node-java
Node.js
想要和 Java
連接,需要一個 node-java 模塊隔躲。
環(huán)境準備
操作系統(tǒng):支持 OSX摩梧,Linux
運行環(huán)境(建議選擇):
Nodejs LTS 版本 最低要求 6.x

java JDK 1.8 +

Liunx gcc 4.8.1 +

安裝模塊
$ npm install java

Liunx如果不支持 c++ 11 需要手動升級 gcc 到 gcc 4.8.) 參考地址
如果是 Mac
提示:顯示需要安裝舊Java SE 6運行環(huán)境才能打開,請下載 JDK 2015
Node.js 調(diào)用 Java
HelloWorld
java

public class HelloWorld {
public static void main(String[] args) {
 System.out.println("Hello World!"); }}

輸出: Hello World!
Node.js

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

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

輸出: Hello World!

操作Java Map

java 操作 HashMap

import java.util.HashMap;
import java.util.Map;

public class HashMapDemo {
  public static void main(String[] args) {
    Map<String, Object> map = new HashMap<>();

    map.put("name", "SunilWang");
    map.put("age", 20);

    String name = (String) map.get("name");
    int age = (int) map.get("age");

    System.out.printf("name:%s", name);
    System.out.println("");
    System.out.printf("age:%d", age);
  }
}

輸出: name:SunilWang age:20

Node.js 同步調(diào)用 java HashMap

const java = require('java')
const HashMap = java.import('java.util.HashMap')
// 同步操作

let hashMap = new HashMap()

hashMap.putSync('name', 'SunilWang')
hashMap.putSync('age', 20)

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

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

輸出: name:SunilWang age:20

Node.js callback 調(diào)用 java HashMap

const java = require('java')
const HashMap = java.import('java.util.HashMap')
// callback操作

let hashMap = new HashMap()

hashMap.put('name', 'SunilWang', (error, info) => {
  if (error) console.log('put name Error: ', error)
  hashMap.get('name', (error, name) => {
    if (error) console.log('get name Error: ', error)
    console.log('callback name:%s', name)
  })
})

輸出: callback name:SunilWang

Node.js Promise調(diào)用 java HashMap

const co = require('co')
const java = require('java')

// 當前配置一定要在頂部聲明
java.asyncOptions = {
  syncSuffix: 'Sync', // 同步方法名后綴
  asyncSuffix: '', // 異步方法名后綴
  promiseSuffix: 'Promise', // Promise方法名后綴
  promisify: require('bluebird').promisify // 依賴Promise的模塊
}

// ==============

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

// Promise操作
co(function * () {
  let hashMap = new HashMap()

  yield hashMap.putPromise('name', 'SunilWang')
  yield hashMap.putPromise('age', '20')

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

  console.log('name', name)
  console.log('age', age)
})

創(chuàng)建Java 實例兩種方法

  • Java
import java.util.ArrayList;
import java.util.List;

public class ArrayListDemo {

  public static void main(String[] args) {
    List<String> list1 = new ArrayList<>();
    List<String> list2 = new ArrayList<>();

    list1.add("item1");
    list2.add("item1");

    System.out.printf("size: %d", list1.size()); //2
    System.out.println("");
    // list1 equals list2: true
    System.out.printf("list1 equals list2: %s", list1.equals(list2)); 
  }
}

newInstanceSync

const java = require('java')

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

console.log(list1.sizeSync()) // 0
list1.addSync('item1')
console.log(list1.sizeSync()) // 1

import & new

let ArrayList = java.import('java.util.ArrayList')
let list2 = new ArrayList()

list2.addSync('item1')

let equalValue = list2.equalsSync(list1) 
console.log(equalValue)// true

其他操作

快速new 數(shù)據(jù)組

  • Java
public class CharArrayDemo {

  public static void main(String[] args) {
    char [] charArray = "hello world\n".toCharArray();
    // charArray length: 12
    System.out.printf("charArray length: %d", charArray.length);
  }
}
  • Node.js
let charArray = java.newArray('char', 'hello world\n'.split(''))
// [ 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n' ]
console.log(charArray.length) // 12

快速new Long對象

  • Java
public class LongDemo {

  public static void main(String[] args) {
    Long num = new Long("5");
    System.out.println(num);
    System.out.println(num.longValue());
  }
}
  • Node.js
let javaLong = java.newInstanceSync('java.lang.Long', 5)
// Possibly truncated long value: 5
console.log('Possibly truncated long value: %d', javaLong)
// Original long value (as a string): 5
console.log('Original long value (as a string): %s', javaLong.longValue)

Node.js 調(diào)用自己編譯類

  • Java
package com.nearinfinity.nodeJava;

public class MyClass {
  public static int addNumbers(int a, int b) {
    return a + b;
  }
}
  • Node.js
const java = require('java')
java.classpath.push('./src')

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

let result = MyClass.addNumbersSync(1, 2)
console.log(result)

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

// 快速調(diào)用 Java 靜態(tài)類里面的方法
result = java.callStaticMethodSync('com.nearinfinity.nodeJava.MyClass', 'addNumbers', javaInteger, 3)
console.log(result)

結(jié)束語

上述方法只是帶你了解 node-java 冰山一角宣旱, node-java API很豐富仅父,如 jvm , 實例一個類 浑吟, 調(diào)用類靜態(tài)方法 笙纤, 快速實例化一個對象 等等。
java學習交流群:669823128 禁止閑聊组力,非喜勿加

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末省容,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子燎字,更是在濱河造成了極大的恐慌腥椒,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件候衍,死亡現(xiàn)場離奇詭異笼蛛,居然都是意外死亡,警方通過查閱死者的電腦和手機脱柱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門伐弹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拉馋,“玉大人榨为,你說我怎么就攤上這事』蛙睿” “怎么了随闺?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蔓腐。 經(jīng)常有香客問我矩乐,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任散罕,我火速辦了婚禮分歇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘欧漱。我一直安慰自己职抡,他們只是感情好,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布误甚。 她就那樣靜靜地躺著缚甩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窑邦。 梳的紋絲不亂的頭發(fā)上擅威,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音冈钦,去河邊找鬼郊丛。 笑死,一個胖子當著我的面吹牛瞧筛,可吹牛的內(nèi)容都是我干的宾袜。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼驾窟,長吁一口氣:“原來是場噩夢啊……” “哼庆猫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绅络,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤月培,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恩急,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杉畜,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年衷恭,在試婚紗的時候發(fā)現(xiàn)自己被綠了此叠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡随珠,死狀恐怖灭袁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窗看,我是刑警寧澤茸歧,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站显沈,受9級特大地震影響软瞎,放射性物質(zhì)發(fā)生泄漏逢唤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一涤浇、第九天 我趴在偏房一處隱蔽的房頂上張望鳖藕。 院中可真熱鬧,春花似錦只锭、人聲如沸吊奢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽页滚。三九已至,卻和暖如春铺呵,著一層夾襖步出監(jiān)牢的瞬間裹驰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工片挂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留幻林,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓音念,卻偏偏與公主長得像沪饺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子闷愤,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 這些年以來整葡,Node.js的興起,JavaScript已經(jīng)從當年的“世界最被誤解的語言”變成了“世界最流行的語言”...
    Sunil閱讀 478評論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法讥脐,類相關(guān)的語法遭居,內(nèi)部類的語法,繼承相關(guān)的語法旬渠,異常的語法俱萍,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)告丢,斷路器枪蘑,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 善于學習、思考的她: 她懷著一顆善于學習岖免、善于思考的心來到我的身邊岳颇,成為了我最好的朋友。她可謂是“學霸”觅捆,是全...
    書漫ing閱讀 558評論 0 1
  • 感恩自己早起去買早餐赦役,豆沙卷子麻敌、無糖豆?jié){栅炒、油陀、玉米棒,美味赢赊。謝謝你乙漓,謝謝你,謝謝你释移。 感恩兒子早起去上學叭披,越來越...
    王貽賢閱讀 223評論 0 0