/**
  * 处理函数
  *
  * @param function 函数
  * @return 函数值
  * @throws Exception 类或属性不存在时抛出
  */
 public Object doEvaluateFunction(Function function) throws Exception {
   String name = function.getName();
   int index = name.lastIndexOf('.');
   Assert.assertTrue(index != -1, "不存在类:{0}", new Object[] {name});
   String propertyName = name.substring(0, index); // 最点号前的作为类名或静态属性名
   String className = propertyName;
   Function callFunction =
       new Function(name.substring(index + 1), function.getArgument()); // 将点号最后一截作为静态函数名
   Class clazz = ClassUtils.safeForName(className);
   Stack properties = new LinkedStack();
   while (clazz == null && (index = className.lastIndexOf('.')) != -1) {
     properties.push(className.substring(index + 1));
     className = className.substring(0, index);
     clazz = ClassUtils.safeForName(className);
   }
   Assert.assertNotNull(clazz, "不存在类:{0}", new Object[] {propertyName});
   Object result = convertResult(clazz);
   while (!properties.isEmpty()) {
     result = dotBinaryOperatorHandler.doEvaluate(result, properties.pop());
   }
   return dotBinaryOperatorHandler.doEvaluate(result, callFunction);
 }
 /**
  * 处理属性
  *
  * @param propertyName 属性或类名
  * @return 类元或类静态属性值
  * @throws Exception 类或属性不存在时抛出
  */
 public Object doEvaluateProperties(String propertyName) throws Exception {
   String className = propertyName;
   Class clazz = ClassUtils.safeForName(className);
   Stack properties = new LinkedStack();
   int index;
   while (clazz == null && (index = className.lastIndexOf('.')) != -1) {
     properties.push(className.substring(index + 1));
     className = className.substring(0, index);
     clazz = ClassUtils.safeForName(className);
   }
   Assert.assertNotNull(clazz, "不存在类:{0}", new Object[] {propertyName});
   Object result = convertResult(clazz);
   while (!properties.isEmpty()) {
     result = dotBinaryOperatorHandler.doEvaluate(result, properties.pop());
   }
   return result;
 }