天天看點

Java中運作javascript代碼

Java中運作javascript代碼

  • 1、Java 代碼
  • 2、JS代碼
    • 2.1demoWithParams.js
    • 2.2demoWithListParams.js

第一個示例,通過java将json對象傳遞給js函數

第二個示例, 将數組傳遞給js函數,js需要将其中個别位置的位元組數組組合後再轉回為10進制。

例如,将數組第5和6位,轉變為數字, 0xa1, 0x9F, 也就是線組成a19f,然後轉換41375。

package com.yq.jsdemo;


import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.io.File;
import java.io.Reader;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


/**
 * Simple to Introduction
 * className: JavaJSDemo
 *
 * @author EricYang
 * @version 2018/12/22 9:51
 */

@Slf4j
public class JavaJSListDemo {

    private static final String JS_ENGINE_NAME= "nashorn";
    private final ScriptEngineManager sem = new ScriptEngineManager();
    private final ScriptEngine engine = sem.getEngineByName(JS_ENGINE_NAME);

    public static void main(String[] args) {
        JavaJSListDemo demo = new JavaJSListDemo();

        demo.invokeFunctionByFileWithParams();
        demo.invokeFunctionByFileWithListParams();
    }

    private void invokeFunctionByFileWithParams() {
        log.info("---          invokeFunctionWithParams         ---" );
        try {
            log.info("Current dir={}", System.getProperty("user.dir"));
            File file = new File("./javademo/src/main/resources/demoWithParams.js");
            Reader reader = Files.newBufferedReader(file.toPath(), Charset.defaultCharset());

            Object obj1 = engine.eval(reader);

            Invocable jsInvoke = (Invocable) engine;
            JSONObject user = new JSONObject();
            user.put("name", "張三");
            user.put("age", 18);
            //js函數的就是去user對象age然後加上3
            Object obj2 = jsInvoke.invokeFunction("myFunc", user,3);

            log.info("function={}, result={}", obj1, obj2);
        }
        catch(Exception ex) {
            log.warn("exception", ex);
        }
    }

    private void invokeFunctionByFileWithListParams() {
        log.info("---         With List Params         ---" );
        try {
            log.info("Current dir={}", System.getProperty("user.dir"));
            File file = new File("./javademo/src/main/resources/demoWithListParams.js");
            Reader reader = Files.newBufferedReader(file.toPath(), Charset.defaultCharset());

            Object obj1 = engine.eval(reader);

            Invocable jsInvoke = (Invocable) engine;
            List<Short> dataList = new ArrayList<>();
            //15,01,00,00,00,0x0B,01,03,08,01,83,0x63,0x88,02,03,0xEA,0x1B
            dataList.add((short)0x15);
            dataList.add((short)0x01);
            dataList.add((short)0x00);
            dataList.add((short)0x00);
            dataList.add((short)0x00);
            dataList.add((short)0x0B);
            dataList.add((short)0x01);
            dataList.add((short)0x03);
            dataList.add((short)0x08);

            dataList.add((short)0x01);
            dataList.add((short)0x83);
            dataList.add((short)0x63);
            dataList.add((short)0x88);


            dataList.add((short)0x02);
            dataList.add((short)0x03);
            dataList.add((short)0xEA);
            dataList.add((short)0x1B);

            Object obj2 = jsInvoke.invokeFunction("myFunc", Arrays.toString(dataList.toArray()), "device1234");

            log.info("function={}", obj1);
            log.info("result={}", obj2);
        }
        catch(Exception ex) {
            log.warn("exception", ex);
        }
    }
}
           

function myFunc( user, inc) {
   return user.age + inc ;
}
           

function myFunc(msgStr, deviceIdStr) {
    var scriptInput = JSON.parse(msgStr);
   	var temperature = scriptInput.slice(9, 13);
   	var fullTempValArray = temperature.slice(2, 4);
   	var strArrayTemp = [];
   	for(var i=0; i<2; i++) {
   		strArrayTemp.push(fullTempValArray[i].toString(16));
   	}

   	//console.log("fullTempValArray:", fullTempValArray, ", strArrayTemp:", strArrayTemp.join(''));
   	var tempVal = parseInt(strArrayTemp.join(''), 16);
   	var decimalsNumArray = temperature.slice(1, 2);
   	//tempVal是顯示的值,實際值需要根據decimalsNumArray 進行處理, 這裡的處理規則是如果decimalsNumArray 減去128的數字,作為小數位數。 也就是tempVal需要除以多少,例如當decimalsNum等4, tempVal需要除以10000,保留4位小數
   	var decimalsNum = parseInt(decimalsNumArray.join('')) -128;

   	var actualTempValue = Number((tempVal / (Math.pow(10, decimalsNum))).toFixed(decimalsNum));

   	//console.log(actualTempValue)

   	var humidity = scriptInput.slice(13, 17);
   	//console.log("-humidity--");
   	//console.log(humidity);
   	var fullHumiValArray = humidity.slice(2, 4);

   	var humiVal = parseInt(fullHumiValArray.join(''), 16);
   	var strArrayHumi = [];
   	for(var i=0; i<2; i++) {
   		strArrayHumi.push(fullHumiValArray[i].toString(16));
   	}
    humiVal = parseInt(strArrayHumi.join(''), 16);


   	//console.log("fullHumiValArray", fullHumiValArray, fullHumiValArray.join(''), " new:", humiVal)
   	//console.log("humiVal", humiVal)
   	decimalsNumArray = humidity.slice(1, 2);
   	decimalsNum = parseInt(decimalsNumArray.join('')) % 10;
   	var actualHumiValue = Number((humiVal / (Math.pow(10, decimalsNum))).toFixed(decimalsNum));
   	//console.log(actualHumiValue);


   	var data = {}
   	data.temperature = actualTempValue;
   	data.humidity = actualHumiValue;
   	data.deviceId = deviceIdStr;
    return JSON.stringify(data);
}
           

繼續閱讀