package com.nfwork.dbfound.el; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.beanutils.MethodUtils; import com.nfwork.dbfound.util.LogUtil; public class DBFoundEL { public static Object getData(String express, Map<String, Object> root) { if (express == null) { return null; } String d[] = express.split("\\."); Object currentObject = root; Object object = getData(d, currentObject); return object; } @SuppressWarnings("unchecked") private static Object getData(String d[], Object currentObject) { try { for (int i = 0; i < d.length; i++) { if (currentObject == null) { return null; } String currentExpree = d[i].trim(); int index = findIndex(currentExpree); if (index != -1) { currentExpree = currentExpree.substring(0, currentExpree .indexOf("[")); } // 计算当前对象 Object object = null; if (currentObject instanceof Map) { Map m = (Map) currentObject; object = m.get(currentExpree); } else { String methodEndName = currentExpree.substring(0, 1) .toUpperCase() + currentExpree.substring(1); try { String methodName = "get" + methodEndName; object = MethodUtils.invokeMethod(currentObject, methodName, null); } catch (NoSuchMethodException e) { try { String methodName = "is" + methodEndName; object = MethodUtils.invokeMethod(currentObject, methodName, null); } catch (NoSuchMethodException e2) { return null; } } } if (index != -1) { if (object instanceof List) { List l = (List) object; object = l.get(index); } else if (object instanceof Set) { Set s = (Set) object; Iterator iterator = s.iterator(); while (iterator.hasNext()) { if (index == 0) { object = iterator.next(); break; } index--; } } else if (object instanceof Object[]) { Object[] objects = (Object[]) object; object = objects[index]; } } // 判断是否终止 if (i == d.length - 1) { if (object == null) { return null; } return object; } else { currentObject = object; } } } catch (Exception e) { LogUtil.error(e.getMessage(), e); } return null; } private static int findIndex(String value) { Pattern p = Pattern.compile("\\[[0123456789 ]+\\]"); Matcher m = p.matcher(value); while (m.find()) { String text = m.group(); text = text.substring(1, text.length() - 1); int result = Integer.parseInt(text.trim()); return result; } return -1; } }