反射:找到具有内部字段值的对象

时间:2011-12-11 11:21:31

标签: java reflection

我们如何从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 个答案:

答案 0 :(得分:1)

这是一个通用方法,除了传入 name 字段而不是Field本身之外,它可以执行您想要的操作,因为您可以确保字段和类对齐。考虑一个列表,其中包含不同类的实例,每个类都是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;
}

您可以通过为给定的类等缓存字段来进行优化,但除非您注意到性能问题,否则我最初不会。