@Override
    public RowMapper<T> specialize(ResultSet rs, StatementContext ctx) throws SQLException {
        final UnaryOperator<String> caseChange = ctx.getConfig(ReflectionMappers.class).getCaseChange();
        final List<String> columnNames = getColumnNames(rs, caseChange);
        final List<ColumnNameMatcher> columnNameMatchers =
                ctx.getConfig(ReflectionMappers.class).getColumnNameMatchers();
        final List<String> unmatchedColumns = new ArrayList<>(columnNames);

        RowMapper<T> mapper = createSpecializedRowMapper(ctx, columnNames, columnNameMatchers, unmatchedColumns, Function.identity())
            .orElseGet(() -> new UnmatchedConstructorMapper<>(format(
                UNMATCHED_CONSTRUCTOR_PARAMETERS, factory)));

        if (ctx.getConfig(ReflectionMappers.class).isStrictMatching()
            && anyColumnsStartWithPrefix(unmatchedColumns, prefix, columnNameMatchers)) {

            return new UnmatchedConstructorMapper<>(
                format("Mapping instance factory %s could not match parameters for columns: %s", factory, unmatchedColumns));
        }

        return mapper;
    }
Instantiate a ConstructorMapper using the given constructor and prefix

@param <T> the type to map
@param constructor the constructor to be used in mapping
@param prefix      the column name prefix
@return the mapper
core/src/main/java/org/jdbi/v3/core/mapper/reflect/ConstructorMapper.java