@Nullable
    private static <T> T extractFromField(JavaType classType, JavaType fieldType, String fieldName,
                                          Function<AnnotatedElement, @Nullable T> extractor) {
        try {
            final Field field = classType.getRawClass().getDeclaredField(fieldName);
            if (field.getType() == fieldType.getRawClass()) {
                return extractor.apply(field);
            }
        } catch (NoSuchFieldException ignored) {
            for (Field field : classType.getRawClass().getDeclaredFields()) {
                final JsonProperty renameAnnotation = AnnotationUtil.findFirst(field, JsonProperty.class);
                if (renameAnnotation != null &&
                    renameAnnotation.value().equals(fieldName) &&
                    field.getType() == fieldType.getRawClass()) {
                    return extractor.apply(field);
                }
            }
        }
        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