class ExecutableHint {

    private String name;

    private List<String> parameterTypes;

    private ExecutableMode mode;

    public String getName() {
        return name;
    }

    public List<String> getParameterTypes() {
        return parameterTypes;
    }

    public ExecutableMode getMode() {
        return mode;
    }

    public ExecutableHint(String name, Class<?>[] classes, ExecutableMode mode) {
        this.name = name;
        this.parameterTypes = classes == null ? null : Arrays.stream(classes).map(ReflectUtil::getClassName).collect(Collectors.toList());
        this.mode = mode;
    }

    public ExecutableHint(String name, List<String> parameterTypes) {
        this.name = name;
        this.parameterTypes = parameterTypes;
    }

    @Override
    public boolean equals(Object o) {<FILL_FUNCTION_BODY>}

    @Override
    public int hashCode() {
        return Objects.hash(name, parameterTypes, mode);
    }
}

        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ExecutableHint that = (ExecutableHint) o;
        return Objects.equals(name, that.name) && Objects.equals(parameterTypes, that.parameterTypes) && mode == that.mode;
    
<no_super_class>