public OperateData executeInner()

in src/main/java/com/ql/util/express/instruction/op/OperatorMethod.java [31:134]


    public OperateData executeInner(InstructionSetContext parent, ArraySwap list) throws Exception {
        OperateData p0 = list.get(0);
        Object obj = p0.getObject(parent);
        if (obj instanceof OperateDataVirClass) {
            OperateDataVirClass vClass = (OperateDataVirClass)obj;
            OperateData[] parameters = new OperateData[list.length - 1];
            for (int i = 0; i < list.length - 1; i++) {
                parameters[i] = list.get(i + 1);
            }
            return vClass.callSelfFunction(this.methodName, parameters);
        }

        if (obj == null) {
            if (QLExpressRunStrategy.isAvoidNullPointer()) {
                return null;
            }
            // 对象为空,不能执行方法
            String msg = "对象为空,不能执行方法:";
            throw new QLException(msg + this.methodName);
        } else {
            Class<?>[] types = new Class[list.length - 1];
            Class<?>[] originalTypes = new Class[list.length - 1];

            Object[] objs = new Object[list.length - 1];
            Object tmpObj;
            OperateData p;
            for (int i = 0; i < types.length; i++) {
                p = list.get(i + 1);
                tmpObj = p.getObject(parent);
                types[i] = p.getType(parent);
                originalTypes[i] = p.getType(parent);
                objs[i] = tmpObj;
            }
            AppendingClassMethodManager appendingClassMethodManager = parent.getExpressRunner()
                .getAppendingClassMethodManager();

            if (appendingClassMethodManager != null) {
                AppendingClassMethodManager.AppendingMethod appendingClassMethod
                    = appendingClassMethodManager.getAppendingClassMethod(obj, this.methodName);
                if (appendingClassMethod != null) {
                    return appendingClassMethodManager.invoke(appendingClassMethod, parent, list, null);
                }
            }
            if (QLExpressRunStrategy.isSandboxMode()) {
                throw new QLException("没有找到方法:" + this.methodName);
            }
            Method method = null;
            // 调用静态方法
            if (p0 instanceof OperateClass) {
                method = ExpressUtil.findMethodWithCache((Class<?>)obj, this.methodName, types, true, true);
            } else {
                if (obj instanceof Class) {
                    method = ExpressUtil.findMethodWithCache((Class<?>)obj, this.methodName, types, true, true);
                }
                if (method == null) {
                    method = ExpressUtil.findMethodWithCache(obj.getClass(), this.methodName, types, true, false);
                }
            }
            if (method == null) {
                types = new Class[] {ARRAY_CLASS};
                // 调用静态方法
                if (p0 instanceof OperateClass) {
                    method = ExpressUtil.findMethodWithCache((Class<?>)obj, methodName, types, true, true);
                } else {
                    method = ExpressUtil.findMethodWithCache(obj.getClass(), methodName, types, true, false);
                }
                objs = new Object[] {objs};
            }
            if (method == null) {
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("没有找到").append(obj.getClass().getName()).append("的方法:").append(methodName).append(
                    "(");
                for (int i = 0; i < originalTypes.length; i++) {
                    if (i > 0) {
                        stringBuilder.append(",");
                    }
                    if (originalTypes[i] == null) {
                        stringBuilder.append("null");
                    } else {
                        stringBuilder.append(originalTypes[i].getName());
                    }
                }
                stringBuilder.append(")");
                throw new QLException(stringBuilder.toString());
            }

            //阻止调用不安全的方法
            QLExpressRunStrategy.assertSecurityRiskMethod(method);

            // 调用静态方法
            if (p0 instanceof OperateClass) {
                boolean oldA = method.isAccessible();
                method.setAccessible(true);
                tmpObj = method.invoke(null, ExpressUtil.transferArray(objs, method.getParameterTypes()));
                method.setAccessible(oldA);
            } else {
                boolean oldA = method.isAccessible();
                method.setAccessible(true);
                tmpObj = method.invoke(obj, ExpressUtil.transferArray(objs, method.getParameterTypes()));
                method.setAccessible(oldA);
            }
            return OperateDataCacheManager.fetchOperateData(tmpObj, method.getReturnType());
        }
    }