Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 反射:查找具有内部字段值的对象_Java_Reflection - Fatal编程技术网

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

Java 反射:查找具有内部字段值的对象,java,reflection,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 co

我们如何从
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);
类MyType{
公共字符串标题;
公共int ID;
}
ArrayList myArray;//充满数据
函数findRowByColumnValue(ArrayList数组、字段列、对象比较值){
//列出“数组”的所有成员
//并将内部字段“column”与“compareValue”进行比较
}
//这样叫
findRowByColumnValue(myArray,MyType.class.getField(“ID”),2);

这里有一个通用方法,它可以执行您想要的操作,除了传入字段名,而不是
字段本身,因为这样可以确保字段和类对齐。考虑一个具有不同类的实例的列表,每个类型都是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;
}
静态列表findRowByColumnValue(列表数组、字符串列、对象比较值){
列表点击次数=新建ArrayList();
for(T元素:数组){
if(element!=null&&compareValue.equals(
element.getClass().getField(列).get(元素))
添加(元素);
}
回击;
}

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

这是一个通用的方法,除了您在字段名中传递,而不是<代码>字段本身,您还可以这样做,因为这样您就可以确保字段和类对齐。对于不同类的实例,每个类型都是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;
}
静态列表findRowByColumnValue(列表数组、字符串列、对象比较值){
列表点击次数=新建ArrayList();
for(T元素:数组){
if(element!=null&&compareValue.equals(
element.getClass().getField(列).get(元素))
添加(元素);
}
回击;
}

您可以通过缓存给定类等的字段进行优化,但除非您注意到性能问题,否则一开始我不会这样做。

谢谢Bohemian,您透露了一些我没有想到的事情。非常好:-)@MarekSebera注:我刚刚注意到一个错误并更正了它:它应该是
…get(element)
(而不是
…get(column)
)谢谢你的通知!很高兴我这么慢就实现了:)谢谢波希米亚人,你透露了一些我没有想到的事情。非常好:-)@MarekSebera注意:我刚刚注意到一个错误并更正了它:它应该是
…get(element)
(不是
…get(column)
)谢谢您的通知!很高兴我这么慢就实现了:)