[英]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.