对于下面的问题,我尝试在网上搜索,但找不到答案。我正在使用 Java 语言工作。
所以我现在有一个类,可以说:
public Employee(String emp_id, String location, String name)
{
this.emp_id = emp_id;
this.location = location;
this.name = name;
}
我创建了多个 Employee 对象,并将其保存在 arrayList 中。现在,用户将询问哪些员工位于纽约,或者他们可以询问哪些员工名为 John。
这样他们就可以进入纽约地点。我需要读取用户的请求,首先确定他们要搜索的内容,然后查看数组中是否有匹配的员工。
我已读入该命令,并将其保存在名为“搜索”的字符串数组中。第一个索引保存对象的字段/属性的名称,第二个索引将保存用户实际想要检查的内容。
String[] search = new String[] { "location", "New York" }
我正在考虑这样做:
for(Employee e: empList)
if(e.search[0].equals(search[1]))
System.out.println(e)
但是,我无法执行此操作,因为 search[0]
不是 Employee
对象的属性名称。我收到此错误:错误:找不到符号。
有没有办法让我在没有实际名称的情况下访问对象属性,这意味着名称保存在另一个 String
变量中?
请告诉我。感谢您的帮助。
谢谢。
最佳答案
您正在寻找的是Reflection API。这是一个简单的示例,说明如何实现您的需求。请注意,我们可以查询该类的字段和方法。然后我们可以检查字段类型或方法返回类型。反射不适合胆小的人,但它可以为您提供一些极其动态的代码。
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Employee {
public String name;
public int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public static void main(String[] args) throws Exception {
Employee e1 = new Employee("Nick", 30);
Class<?> c = e1.getClass();
Field f = c.getField("name");
System.out.print("Type: ");
System.out.println(f.getType());
System.out.print("Object: ");
System.out.println(f.get(e1));
System.out.println();
System.out.println("Methods: ");
Method[] methods = c.getMethods();
for(int i = 0; i < methods.length; i++) {
System.out.print("Name: ");
System.out.println(methods[i].getName());
System.out.print("Return type: ");
System.out.println(methods[i].getReturnType());
// imagine this value was set by user input
String property = "name";
if( methods[i].getName().toLowerCase().equals("get" + property) ) {
System.out.print("Value of " + property + " is: ");
System.out.println(methods[i].invoke(e1));
}
}
}
}
关于Java - 不使用直接字段名称访问对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48285798/