package com.deepnighttwo.scriptusingarray; import java.util.HashMap; import java.util.Map; import javax.script.Bindings; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class ScriptArrayTest { /** * @param args * @throws ScriptException */ @SuppressWarnings("rawtypes") public static void main(String[] args) throws ScriptException { ScriptEngineManager seManager = new ScriptEngineManager(); ScriptEngine jsEngine = seManager.getEngineByName("javascript"); if (jsEngine == null) { System.out.println("No engine found for javascript"); System.exit(1); } jsEngine.eval("println('Coooool! Let\\'s Rock \\'n Roll with JS in java now!');"); // jsEngine.put("arrjava", new String[] { "aaa", "bbb", "ccc" }); jsEngine.put("arrjava", new double[] { 111.111, 222.222, 33.33 }); jsEngine.put("cmp", new HashMap<String, Double>()); jsEngine.eval("function getArrValue(arr){var v = arr[1];" + "println((v+arr[0]));}"); // parseFloat() parseInt() jsEngine.eval("function mapValue(){cmp.put('d1',3.8);cmp.put('d2',9)}"); jsEngine.eval("var bd1=0; var bd2=0; function bindingValue(){bd1=3.8;bd2=9;}"); jsEngine.eval("mapValue();println(cmp.get('d1') + cmp.get('d2'))"); jsEngine.eval("bindingValue();println('double plus='+(bd1+bd2))"); // 对于数组,声明了明确的类型,在js中是可以得到正确的类型的,比如double,int, 不会被转成string jsEngine.put("vvv", 1); jsEngine.eval("println('vvv plus='+(vvv+vvv))"); jsEngine.put("vvvArr", new int[] { 1 }); jsEngine.eval("println('vvvArr plus='+(vvvArr[0]+vvvArr[0]))"); jsEngine.eval("println('arrjava plus='+(arrjava[0]+arrjava[1]))"); // 对于map,都是string。这也不难理解,因为map。get方法的返回值类型是object,所以肯定会被转成string。规则应该是,如果知道是哪个基本类型,比如int,double,那么在js中就不会改变。 Map<String, Double> dm = new HashMap<String, Double>(); jsEngine.put("dm", dm); dm.put("d1", 1.1); dm.put("d2", 2.3); jsEngine.eval("println('vvv plus='+(dm.get('d1')+dm.get('d2')))"); jsEngine.eval("function getRet(){return 1<2};"); System.out.println(jsEngine.eval("getRet();")); jsEngine.eval("function getRetTTT(){return parseInt('1');};"); System.out.println(jsEngine.eval("getRetTTT();").getClass().getName()); Bindings b = jsEngine.createBindings(); System.out.println(jsEngine.eval("getRetTTT();", b).getClass() .getName()); } private static void defineFunctionAddInJs(ScriptEngine jsEngine, Bindings bindings) throws ScriptException { jsEngine.eval("function getArrValue(arr){var v = arr[1];" + "println('value from java array'+v);}"); } }