Java Reflection, игнорировать регистр при использовании GetDeclaredField - PullRequest
4 голосов
/ 18 марта 2011

Допустим, у меня есть класс со строковым полем с именем "myfield", и я использую отражение, чтобы получить поле. Я обнаружил, что Object.getClass().getDeclaredField("myfield"); чувствителен к регистру, он выдаст NoSuchFieldException, если я, например, используюObject.getClass().getDeclaredField("MyField");

Есть ли способ обойти это?заставить его игнорировать регистр?

Спасибо

Ответы [ 7 ]

15 голосов
/ 18 марта 2011

Просто используйте Class.getDeclaredFields() и просмотрите результаты, выполнив поиск без учета регистра.

3 голосов
/ 18 марта 2011

Нет, прямого способа сделать это не существует, однако вы можете создать вспомогательный метод для этого.например (не проверено)

public Field getDeclaredFieldIngoreCase( Class<?> clazz, String fieldName ) throws NoSuchFieldException {

        for( Field field : clazz.getDeclaredFields() ) {
            if ( field.getName().equalsIgnoreCase( fieldName ) ) {
                return field;
            }
        }
        throw new NoSuchFieldException( fieldName );
}
3 голосов
/ 18 марта 2011

Нет, такого способа нет. Вы можете получить все поля и искать по ним:

Field[] fields = src.getClass().getDeclaredFields();
for(Field f:fields){
    if(f.getName().equalsIgnoreCase("myfield")){
    //stuff.
    }
}
2 голосов
/ 18 марта 2011

Получить список всех объявленных полей и вручную пройти их в цикле, сравнивая имя без учета регистра.

2 голосов
/ 18 марта 2011

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

0 голосов
/ 13 сентября 2018

Лучше всего попытаться получить поле с fieldName, если оно не существует, затем просмотреть список полей

public static Field findFieldIgnoreCase(Class<?> clazz, String fieldName) throws SecurityException, NoSuchFieldException {
    try {
        return clazz.getDeclaredField(fieldName);
    } catch (NoSuchFieldException e) {
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            if (field.getName().equalsIgnoreCase(fieldName)) {
                return field;
            }
        }
        throw new NoSuchFieldException(fieldName);
    }
}
0 голосов
/ 24 апреля 2018

Я не имею в виду necro этот поток, но если вы использовали какой-либо из методов выше в цикле, ваша производительность будет ужасна. Создайте карту заранее

сначала возьмите искомый элемент в верхний регистр

item.getKey()

теперь создайте карту, которая имеет заглавную версию и истинные имена полей

Map<String, String> fieldNames = Arrays.asList(clazz.getDeclaredFields()).stream().collect(Collectors.toMap(t -> t.getName().toUpperCase(), f->f.getName()));

теперь используйте это, чтобы получить истинное имя поля

  Field field = clazz.getDeclaredField(fieldNames.get(key));

Я бы сказал, всегда создавайте такую ​​карту, всегда учитывайте производительность, когда дело доходит до отражения.

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