public Object dispatch(mClass objClass, String methodName,
			Object... parameters) {
		Method m = getMethod(methodName);
		Object result = null;
		Object obj = null;
		int countOld = countNewOperator;
		countNewOperator = 0;
		try {
			if (objClass != null) {
				obj = objClass;
			} else if (!Modifier.isStatic(m.getModifiers())) {
				obj = m.getDeclaringClass().newInstance();
				if (obj instanceof mClass) {
					((mClass) obj).setContext(this);
				}
			}
			if (m.getParameterTypes() != null
					&& m.getParameterTypes().length > 0
					&& m.getParameterTypes()[0].isArray()) {
				parameters = new Object[] { parameters };
			}
			if (m.getReturnType().equals(Void.TYPE)) {
				m.invoke(obj, parameters);
			} else {
				result = m.invoke(obj, parameters);
			}

		} catch (Exception e) {
			throw new IllegalStateException("Fail to execute method: "
					+ methodName + " and its parameters: "
					+ Arrays.deepToString(parameters), e);
		}

		oldvar();
		countNewOperator = countOld;
		return result;
	}