@Nullable
    private static <T> T extractFromConstructor(JavaType classType, JavaType fieldType, String fieldName,
                                                Function<AnnotatedElement, @Nullable T> extractor) {
        final Constructor<?>[] ctors = classType.getRawClass().getDeclaredConstructors();
        if (ctors.length == 0) {
            return null;
        }
        Constructor<?> constructor = null;
        for (Constructor<?> ctor : ctors) {
            final Parameter[] parameters = ctor.getParameters();
            final int length = parameters.length;
            if (length == 0) {
                continue;
            }
            if ("kotlin.jvm.internal.DefaultConstructorMarker".equals(
                    parameters[length - 1].getType().getName())) {
                // Ignore an additional constructor generated by Kotlin compiler which is added when a
                // default value is defined in the constructor.
                continue;
            }
            if (constructor == null || constructor.getParameters().length < length) {
                constructor = ctor;
            }
        }
        if (constructor == null) {
            return null;
        }

        final Parameter[] parameters = constructor.getParameters();
        for (final Parameter parameter : parameters) {
            if (parameter.isNamePresent() &&
                parameter.getName().equals(fieldName) &&
                parameter.getType() ==
                fieldType.getRawClass()) {
                return extractor.apply(parameter);
            }
            final JsonProperty renameAnnotation = AnnotationUtil.findFirst(parameter, JsonProperty.class);
            if (renameAnnotation != null &&
                renameAnnotation.value().equals(fieldName) &&
                parameter.getType() == fieldType.getRawClass()) {
                return extractor.apply(parameter);
            }
        }
        return null;
    }
A default {@link DescriptiveTypeInfoProvider} to create a {@link StructInfo} from a {@code typeDescriptor}.
If {@code typeDescriptor} is unknown type, Jackson is used to try to extract fields
and their metadata.
core/src/main/java/com/linecorp/armeria/internal/server/annotation/DefaultDescriptiveTypeInfoProvider.java