All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alibaba.qlexpress4.runtime.function.QMethodFunction Maven / Gradle / Ivy

package com.alibaba.qlexpress4.runtime.function;

import com.alibaba.qlexpress4.exception.UserDefineException;
import com.alibaba.qlexpress4.member.MethodHandler;
import com.alibaba.qlexpress4.runtime.IMethod;
import com.alibaba.qlexpress4.runtime.JvmIMethod;
import com.alibaba.qlexpress4.runtime.MemberResolver;
import com.alibaba.qlexpress4.runtime.Parameters;
import com.alibaba.qlexpress4.runtime.QContext;
import com.alibaba.qlexpress4.runtime.data.convert.ParametersTypeConvertor;
import com.alibaba.qlexpress4.utils.BasicUtil;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * Author: DQinYuan
 */
public class QMethodFunction implements CustomFunction {

    private final Object object;

    private final IMethod method;

    public QMethodFunction(Object object, Method method) {
        this.object = object;
        this.method = new JvmIMethod(method);
    }

    @Override
    public Object call(QContext qContext, Parameters parameters) throws Throwable {
        Object[] argumentsArr = BasicUtil.argumentsArr(parameters);
        Class[] typeArr = BasicUtil.getTypeOfObject(argumentsArr);

        int priority = MemberResolver.resolvePriority(method.getParameterTypes(), typeArr);
        if (priority == MemberResolver.MatchPriority.MISMATCH.priority) {
            throw new UserDefineException(UserDefineException.ExceptionType.INVALID_ARGUMENT,
                    "invalid argument types " + Arrays.toString(typeArr) + " for java method '" + method.getName() + "'"
                    + " in declaring java class '" + method.getDeclaringClass().getName() + "'"
            );
        }
        Object[] convertResult = ParametersTypeConvertor.cast(argumentsArr, method.getParameterTypes(), method.isVarArgs());
        return MethodHandler.Access.accessMethodValue(method, object, convertResult);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy