繁体   English   中英

Java 根据变量从 ArrayList 获取值

[英]Java Get value from ArrayList depending on variable

我有个问题。 我创建了以下 class:

public class Person {

    public String name;
    public int age;
    public String city
    public String street;

    public Person(String name, int age, String city, String street) {
        this.name = name;
        this.age = age;
        this.city = city;
        this.street = street;
    }

}

然后我创建了一个 ArrayList:

ArrayList<Person> personList = new ArrayList<>();
personList.add(new Person("Dave", 21, "Rotterdam", "Langedijk"));
personList.add(new Person("Peter", 26, "The Hauge", "Snelplein"));
personList.add(new Person("Lorenzo", 23, "Amsterdam", "Bloemstraat"));

现在我有一个像这样的变量:

String itemToGet = "city";

在这个例子中,我使用索引 0。我想要这样的东西:

personList.get(0).itemToGet;

我知道这行不通,但我希望你明白这一点。 我想获取itemToGet字符串中的元素。

这有可能吗?

使用 java 反射:

 String itemToGet = "city";
 Class personClass = Person.class;
 Field field = personClass.getField(itemToGet);
 Object value = field.get(personList.get(0));

您还可以确定字段类型:

Object fieldType = field.getType();

像这样使用使用 Field 的反射:

        try{
            Field city = personList.get(0).class.getField(itemToGet);
            String cityval = (String) city.get(personList.get(0));
        } catch (NoSuchFieldException e){
           //handle 
        } catch (IllegalArgumentException e){
           //handle 
        } catch (IllegalAccessException e){
           //handle 
        };

或者,如果您有一个 getter 方法,那么您可以使用以下方法进行反射:

        try{
            Method cityMethod = personList.get(0).class.getMethod("getCity", String.class);
            String cityval = (String) cityMethod.invoke(personList.get(0));
    
        } catch (IllegalArgumentException e){

        } catch (IllegalAccessException e){

        } catch (NoSuchMethodException e){

        } catch (InvocationTargetException e){
            
        };

除了使用反射(@Сергей Афиногенов 的解决方案)之外,您还可以使用需要对 POJO Person 进行更多修改的经典方式,但我认为它比使用反射更清晰。 这是一个使用 CONSTANTS 的示例

public class Sample {
  static int NAME = 0, AGE = 1, CITY = 2, STREET = 3; 
  public static void main(String... a) {
    ArrayList<Person> personList = new ArrayList<>();
    personList.add(new Person("Dave", 21, "Rotterdam", "Langedijk"));
    personList.add(new Person("Peter", 26, "The Hauge", "Snelplein"));
    personList.add(new Person("Lorenzo", 23, "Amsterdam", "Bloemstraat"));
    System.out.println(personList.get(0).getItem(CITY)+", Age:"+personList.get(0).getItem(AGE));
  }
  private static class Person {
    public Person(String name, int age, String city, String street) {
      this.name = name;
      this.age = age;
      this.city = city;
      this.street = street;
    }
    String name, city, street;
    int age;
    public Object getItem(int item) {
      switch (item) {
       case 0: return name;
       case 1: return new Integer(age);
       case 2: return city;
       case 3: return street;
      }
      return null;
    }
  }
}

和打印输出:

Rotterdam, Age:21

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM