Как упростить приведение типов в Java - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть утилита отражения.Этот класс реализован для приведения значений определенных полей, полученных с помощью отражения.

Я даю код:

/**
 * Get the field values with the types already listed according to the field type
 *
 * @param clazz clazz
 * @param fieldName fieldName
 * @param fieldValue fieldValue
 * @return value cast to specific field type
 */
public static Object castFieldValue(Class<?> clazz, String fieldName, Object fieldValue) {
    Field field = getField(clazz, fieldName)
            .orElseThrow(() -> new IllegalArgumentException("Cannot find field name:" + fieldName));

    Class<?> fieldType = field.getType();

    if (fieldType.isAssignableFrom(Double.class)) {
        if (fieldValue instanceof String) {
            return Double.valueOf((String)fieldValue);
        }
        return ((Number) fieldValue).doubleValue();
    }

    if (fieldType.isAssignableFrom(Long.class)) {
        if (fieldValue instanceof String) {
            return Long.valueOf((String)fieldValue);
        }
        return ((Number) fieldValue).longValue();
    }

    if (fieldType.isAssignableFrom(Float.class)) {
        if (fieldValue instanceof String) {
            return Float.valueOf((String)fieldValue);
        }
        return ((Number) fieldValue).floatValue();
    }

    if (fieldType.isAssignableFrom(Integer.class)) {
        if (fieldValue instanceof String) {
            return Integer.valueOf((String)fieldValue);
        }
        return ((Number) fieldValue).intValue();
    }

    if (fieldType.isAssignableFrom(Short.class)) {
        if (fieldValue instanceof String) {
            return Short.valueOf((String)fieldValue);
        }
        return ((Number) fieldValue).shortValue();
    }

    return fieldValue;
}

public static Optional<Field> getField(Class<?> clazz, String fieldName) {
    Field[] fields = getAllFields(clazz);
    return Stream.of(fields)
            .filter(x -> x.getName().equals(fieldName))
            .findFirst();
}

public static Field[] getAllFields(Class<?> clazz) {
    if (clazz == null) return null;

    List<Field> fields = new ArrayList<>(Arrays.asList(clazz.getDeclaredFields()));
    if (clazz.getSuperclass() != null) {
        // danger! Recursion
        fields.addAll(Arrays.asList(getAllFields(clazz.getSuperclass())));
    }
    return fields.toArray(new Field[] {});
}

Этот код очень многословен.Можно ли как-то его упростить?

Этот фрагмент кода повторяется много раз с небольшими изменениями:

if (fieldType.isAssignableFrom(Short.class)) {
    if (fieldValue instanceof String) {
        return Short.valueOf((String)fieldValue);
    }
    return ((Number) fieldValue).shortValue();
}

Если я еще раз уточнить, что делает мой метод, это приводитк правильному типу значения в соответствии с типом поля класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...