package com.smtservlet.util; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class SMTScriptObject { private static Map _method = null; private static synchronized Map getMethodMap(Object oo) { if(_method == null) { _method = new HashMap(); for(Method method : oo.getClass().getDeclaredMethods()) { _method.put(method.getName(), method); } } return _method; } /** * 从js对象中获取子对象,如果获取不到则抛出异常 * * @param jsonConfig - js对象 * @param key - 要获取的key * @return - 返回获取后的值 */ @SuppressWarnings("rawtypes") public static Object getScriptObject(Object jsonConfig, String key) throws Exception { if(jsonConfig instanceof Map) { if(!((Map)jsonConfig).containsKey(key)) throw new Exception(String.format("json [%s] can't find key [%s]", jsonConfig.toString(), key)); return ((Map)jsonConfig).get(key); } else if(!SMTScriptObject.isScriptObjectMirror(jsonConfig)) throw new Exception(String.format("object -->[%s] is not ScriptObjectMirror", jsonConfig.getClass().toString())); Object json = SMTScriptObject.get(jsonConfig, key); if(json == null) throw new Exception(String.format("json [%s] can't find key [%s]", jsonConfig.toString(), key)); return json; } /** * 从js对象中获取子对象,如果获取不到则返回defValue * * @param jsonConfig - js对象 * @param key - 要获取的key * @param defValue - 缺省值 * @return - 返回获取后的值 */ @SuppressWarnings("rawtypes") public static Object getScriptObject(Object jsonConfig, String key, Object defValue) throws Exception { if(jsonConfig instanceof Map) { if(!((Map)jsonConfig).containsKey(key)) return defValue; return ((Map)jsonConfig).get(key); } if(!SMTScriptObject.isScriptObjectMirror(jsonConfig)) throw new Exception(String.format("object -->[%s] is not ScriptObjectMirror", jsonConfig.getClass().toString())); Object json = SMTScriptObject.get(jsonConfig, key); if(json == null) return defValue; return json; } @SuppressWarnings("unchecked") public static Set> entrySet(Object oo) throws Exception { Object ret = SMTScriptObject.getMethodMap(oo).get("entrySet").invoke(oo); return (Set>) ret; } public static Object call(Object oo, Object...arg) throws Exception { return SMTScriptObject.getMethodMap(oo).get("call").invoke(oo, null, arg); } public static boolean isScriptObjectMirror(Object oo) { return oo.getClass().getName().equals("jdk.nashorn.api.scripting.ScriptObjectMirror"); } public static Object get(Object oo, Object key) throws Exception { return SMTScriptObject.getMethodMap(oo).get("get").invoke(oo, key); } public static boolean isFunction(Object oo) throws Exception { return (Boolean) SMTScriptObject.getMethodMap(oo).get("isFunction").invoke(oo); } }