class OperatorSelfDefineClassFunction extends OperatorBase implements CanClone {
    private final String functionName;
    private final String[] parameterTypes;
    private final Class<?>[] parameterClasses;
    private final Class<?> operatorClass;
    private Object operatorInstance;
    private final Method method;
    private boolean isReturnVoid;
    private final boolean maybeDynamicParams;

    public OperatorSelfDefineClassFunction(String operatorName, Class<?> operatorClass, String functionName,
        Class<?>[] parameterClassTypes, String[] parameterDesc, String[] parameterAnnotation, String errorInfo)
        throws Exception {
        this.name = operatorName;
        this.errorInfo = errorInfo;
        this.functionName = functionName;
        this.parameterClasses = parameterClassTypes;
        this.parameterTypes = new String[parameterClassTypes.length];
        this.operateDataDesc = parameterDesc;
        this.operateDataAnnotation = parameterAnnotation;
        for (int i = 0; i < this.parameterClasses.length; i++) {
            this.parameterTypes[i] = this.parameterClasses[i].getName();
        }
        this.operatorClass = operatorClass;
        method = this.operatorClass.getMethod(functionName, parameterClasses);
        this.isReturnVoid = method.getReturnType().equals(void.class);
        this.maybeDynamicParams = DynamicParamsUtil.maybeDynamicParams(parameterClasses);
    }

    public OperatorSelfDefineClassFunction(String operatorName, String className, String functionName,
        Class<?>[] parameterClassTypes, String[] parameterDesc, String[] parameterAnnotation, String errorInfo)
        throws Exception {
        this.name = operatorName;
        this.errorInfo = errorInfo;
        this.functionName = functionName;
        this.parameterClasses = parameterClassTypes;
        this.parameterTypes = new String[parameterClassTypes.length];
        this.operateDataDesc = parameterDesc;
        this.operateDataAnnotation = parameterAnnotation;
        for (int i = 0; i < this.parameterClasses.length; i++) {
            this.parameterTypes[i] = this.parameterClasses[i].getName();
        }
        operatorClass = ExpressUtil.getJavaClass(className);
        method = operatorClass.getMethod(functionName, parameterClasses);
        this.isReturnVoid = method.getReturnType().equals(void.class);
        this.maybeDynamicParams = DynamicParamsUtil.maybeDynamicParams(parameterClasses);
    }

    public OperatorSelfDefineClassFunction(String operatorName, String className, String functionName,
        String[] parameterTypes, String[] parameterDesc, String[] parameterAnnotation, String errorInfo)
        throws Exception {
        this.name = operatorName;
        this.errorInfo = errorInfo;
        this.functionName = functionName;
        this.parameterTypes = parameterTypes;
        this.operateDataDesc = parameterDesc;
        this.operateDataAnnotation = parameterAnnotation;
        this.parameterClasses = new Class[this.parameterTypes.length];
        for (int i = 0; i < this.parameterClasses.length; i++) {
            this.parameterClasses[i] = ExpressUtil.getJavaClass(this.parameterTypes[i]);
        }
        operatorClass = ExpressUtil.getJavaClass(className);
        method = operatorClass.getMethod(functionName, parameterClasses);
        this.maybeDynamicParams = DynamicParamsUtil.maybeDynamicParams(parameterClasses);
    }

    @Override
    public OperatorBase cloneMe(String opName, String errorInfo) throws Exception {<FILL_FUNCTION_BODY>}

    @Override
    public OperateData executeInner(InstructionSetContext parent, ArraySwap list) throws Exception {
        Object[] parameters = DynamicParamsUtil.transferDynamicParams(parent, list, parameterClasses,
            this.maybeDynamicParams);
        Object obj;
        if (Modifier.isStatic(this.method.getModifiers())) {
            obj = this.method.invoke(null, ExpressUtil.transferArray(parameters, parameterClasses));
        } else {
            if (operatorInstance == null) {
                operatorInstance = operatorClass.newInstance();
            }
            obj = this.method.invoke(operatorInstance, ExpressUtil.transferArray(parameters, parameterClasses));
        }

        if (obj != null) {
            return OperateDataCacheManager.fetchOperateData(obj, obj.getClass());
        }
        if (this.isReturnVoid) {
            return OperateDataCacheManager.fetchOperateDataAttr("null", void.class);
        } else {
            return OperateDataCacheManager.fetchOperateDataAttr("null", null);
        }
    }
}

        return new OperatorSelfDefineClassFunction(opName, this.operatorClass.getName(), this.functionName,
            this.parameterClasses, this.operateDataDesc, this.operateDataAnnotation, errorInfo);
    
<methods>public non-sealed void <init>() ,public com.ql.util.express.OperateData execute(com.ql.util.express.InstructionSetContext, com.ql.util.express.ArraySwap, List<java.lang.String>) throws java.lang.Exception,public abstract com.ql.util.express.OperateData executeInner(com.ql.util.express.InstructionSetContext, com.ql.util.express.ArraySwap) throws java.lang.Exception,public java.lang.String getAliasName() ,public java.lang.String getErrorInfo() ,public java.lang.String getName() ,public java.lang.String[] getOperateDataAnnotation() ,public java.lang.String[] getOperateDataDesc() ,public boolean isPrecise() ,public void setAliasName(java.lang.String) ,public void setErrorInfo(java.lang.String) ,public void setName(java.lang.String) ,public void setPrecise(boolean) ,public java.lang.Object[] toObjectList(com.ql.util.express.InstructionSetContext, com.ql.util.express.ArraySwap) throws java.lang.Exception,public java.lang.String toString() <variables>protected java.lang.String aliasName,protected java.lang.String errorInfo,protected boolean isPrecise,protected java.lang.String name,protected java.lang.String[] operateDataAnnotation,protected java.lang.String[] operateDataDesc