protected ObjectFormatter getObjectFormatter(Field field) {
        Class type = field.getType();
        if (List.class.isAssignableFrom(type) || Map.class.isAssignableFrom(type)) {
            type = String.class;
        }
        if (field.isAnnotationPresent(Formatter.class)) {
            Formatter formatter = field.getAnnotation(Formatter.class);
            if (!formatter.formatter().equals(TypeFormatter.class)) {
                TypeFormatter typeFormatter = typeFormatterFactory.getByFormatterClass(formatter.formatter());
                if (typeFormatter != null) {
                    return prepareTypeFormatterParam(typeFormatter,formatter.value());
                }
                typeFormatterFactory.put(formatter.formatter());
                return prepareTypeFormatterParam(typeFormatterFactory.getByFormatterClass(formatter.formatter()), formatter.value());
            } else if (!formatter.subClazz().equals(String.class)) {
                type = formatter.subClazz();
                TypeFormatter typeFormatter = typeFormatterFactory.get(type);
                if (typeFormatter == null) {
                    throw new IllegalArgumentException("No typeFormatter for class " + type);
                }
                return prepareTypeFormatterParam(typeFormatter, formatter.value());
            }
        }
        return getTypeFormatterFactory().get(BasicTypeFormatter.detectBasicClass(type));
    }