在Java中如何从字符串访问对象属性?

在Java中如何从字符串访问对象属性?,java,class,Java,Class,我有一个字符串,它告诉我应该使用哪个属性进行一些过滤。如何使用此字符串实际访问对象中的数据 我有一个返回字符串列表的方法,告诉我如何筛选对象列表。例如: String[]{“id=123”,“name=foo”} 因此,我的第一个想法是将字符串分成两部分: filterString.split(“=”)并使用字符串的第一部分(例如“id”)标识要筛选的属性 作为JS背景,我会这样做: const attr = filterString.split('=')[0]; // grabs the "i

我有一个字符串,它告诉我应该使用哪个属性进行一些过滤。如何使用此字符串实际访问对象中的数据

我有一个返回字符串列表的方法,告诉我如何筛选对象列表。例如:

String[]{“id=123”,“name=foo”}

因此,我的第一个想法是将字符串分成两部分:
filterString.split(“=”)
并使用字符串的第一部分(例如“id”)标识要筛选的属性

作为JS背景,我会这样做:

const attr = filterString.split('=')[0]; // grabs the "id" part from the string "id=123", for example
const filteredValue = filterString.split('=')[1]; // grabs the "123" part from the string "id=123", for example
items.filter(el => el[`${attr}`] === filteredValue) // returns an array with the items where the id == "123"

我怎样才能用Java做到这一点呢?

这段代码应该可以工作:

  //create the filter map
  Map<String, String> expectedFieldValueMap = new HashMap<>();
    for (String currentDataValue : input) {
        String[] keyValue = currentDataValue.split("=");
        String expectedField = keyValue[0];
        String expectedValue = keyValue[1];
        expectedFieldValueMap.put(expectedField, expectedValue);
    }

此代码应适用于:

  //create the filter map
  Map<String, String> expectedFieldValueMap = new HashMap<>();
    for (String currentDataValue : input) {
        String[] keyValue = currentDataValue.split("=");
        String expectedField = keyValue[0];
        String expectedValue = keyValue[1];
        expectedFieldValueMap.put(expectedField, expectedValue);
    }

您可以使用反射按动态名称获取类的字段

@Test
void test() throws NoSuchFieldException, IllegalAccessException {
    String[] filters = {"id=123", "name=foo"};

    List<Item> list = newArrayList(new Item(123, "abc"), new Item(2, "foo"), new Item(123, "foo"));

    Class<Item> itemClass = Item.class;

    for (String filter : filters) {
        String key = StringUtils.substringBefore(filter, "=");
        String value = StringUtils.substringAfter(filter, "=");

        Iterator<Item> iterator = list.iterator();
        while (iterator.hasNext()) {
            Item item = iterator.next();

            Field field = itemClass.getDeclaredField(key);
            field.setAccessible(true);
            Object itemValue = field.get(item);

            if (!value.equals(String.valueOf(itemValue))) {
                iterator.remove();
            }
        }
    }

    assertEquals(1, list.size());
}
@测试
void test()抛出NoSuchFieldException,IllegalAccessException{
字符串[]过滤器={“id=123”,“name=foo”};
列表=新ArrayList(新项目(123,“abc”)、新项目(2,“foo”)、新项目(123,“foo”);
Class itemClass=Item.Class;
用于(字符串筛选器:筛选器){
String key=StringUtils.substringBefore(filter,“=”);
字符串值=StringUtils.substringAfter(过滤器,“=”);
迭代器迭代器=list.Iterator();
while(iterator.hasNext()){
Item=iterator.next();
字段字段=itemClass.getDeclaredField(键);
字段。setAccessible(true);
对象itemValue=field.get(项);
如果(!value.equals(String.valueOf(itemValue))){
iterator.remove();
}
}
}
assertEquals(1,list.size());
}

但我同意sp00m的评论——这是缓慢的,而且有潜在的危险

您可以使用反射按动态名称获取类的字段

@Test
void test() throws NoSuchFieldException, IllegalAccessException {
    String[] filters = {"id=123", "name=foo"};

    List<Item> list = newArrayList(new Item(123, "abc"), new Item(2, "foo"), new Item(123, "foo"));

    Class<Item> itemClass = Item.class;

    for (String filter : filters) {
        String key = StringUtils.substringBefore(filter, "=");
        String value = StringUtils.substringAfter(filter, "=");

        Iterator<Item> iterator = list.iterator();
        while (iterator.hasNext()) {
            Item item = iterator.next();

            Field field = itemClass.getDeclaredField(key);
            field.setAccessible(true);
            Object itemValue = field.get(item);

            if (!value.equals(String.valueOf(itemValue))) {
                iterator.remove();
            }
        }
    }

    assertEquals(1, list.size());
}
@测试
void test()抛出NoSuchFieldException,IllegalAccessException{
字符串[]过滤器={“id=123”,“name=foo”};
列表=新ArrayList(新项目(123,“abc”)、新项目(2,“foo”)、新项目(123,“foo”);
Class itemClass=Item.Class;
用于(字符串筛选器:筛选器){
String key=StringUtils.substringBefore(filter,“=”);
字符串值=StringUtils.substringAfter(过滤器,“=”);
迭代器迭代器=list.Iterator();
while(iterator.hasNext()){
Item=iterator.next();
字段字段=itemClass.getDeclaredField(键);
字段。setAccessible(true);
对象itemValue=field.get(项);
如果(!value.equals(String.valueOf(itemValue))){
iterator.remove();
}
}
}
assertEquals(1,list.size());
}

但我同意sp00m的评论——这是缓慢的,而且有潜在的危险

Java是一种严格类型化的语言,因此
项的定义现在是相关的。换句话说,请包括您打算用于
项的类
列表/数组。您想做什么?检查Java非常动态的序列化/反序列化。如果JS代码段中的
el
变量是Java中的
Map
s,那么它是可行的,因为
attr
将与键匹配,但是如果
attr
应该与类的属性名称匹配,我只看到使用反射,Java是一种严格类型化的语言,因此
项的定义现在是相关的。换句话说,请包括您打算用于
项的类
列表/数组。您想做什么?检查Java非常动态的序列化/反序列化。如果JS代码段中的
el
变量是Java中的
Map
s,那么它是可行的,因为
attr
将与键匹配,但是如果
attr
应该与类的属性名称匹配,我只看到使用反射,除非万不得已,否则我通常不建议这样做。您缺少示例的第三行:如何按名称访问对象的成员(并按其值筛选数组)?OP的问题是,如果我理解正确,什么应该替换sysout行。您缺少示例的第三行:如何按名称访问对象的成员(并按其值筛选数组)?OP的问题是,如果我理解正确,什么应该替换sysout行。