Отражение: найти объект со значением внутреннего поля - PullRequest
1 голос
/ 11 декабря 2011

Как мы можем отфильтровать отдельный объект из ArrayList, где мы знаем класс внутреннего типа, член класса (Field) и его значение?

псевдокод:

class MyType {
    public String TITLE;
    public int ID;
}

ArrayList<MyType> myArray; // filled with data

function findRowByColumnValue(ArrayList<T> array, Field column, Object compareValue){
    // list all members of "array"
    // and compare the inner field "column" to "compareValue"
}

// called like this
findRowByColumnValue(myArray, MyType.class.getField("ID"), 2);

1 Ответ

1 голос
/ 11 декабря 2011

Вот общий метод, который делает то, что вы хотите, за исключением того, что вы передаете в поле name , а не сам Field, потому что тогда вы можете быть уверены, что Field и Class совпадают. Рассмотрим список со смесью экземпляров разных классов, каждый из которых имеет тип MyClass (но, возможно, подкласс) - каждый класс может использовать свое поле для данного имени столбца.

static <T> List<T> findRowByColumnValue(List<T> array, String column, Object compareValue){
    List<T> hits= new ArrayList<T>();
    for (T element : array) {
        if (element != null && compareValue.equals(
          element.getClass().getField(column).get(element)) 
            hits.add(element);
    }
    return hits;
}

Вы можете оптимизировать, кэшируя Поле для данного класса и т. Д., Но я бы не стал изначально, если вы не заметите проблему с производительностью.

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