Java - 不使用直接字段名称访问对象的属性

标签 java arrays class oop search

对于下面的问题,我尝试在网上搜索,但找不到答案。我正在使用 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/

相关文章:

java - 是否有基于 hibernate 实体 XML 生成 java 源代码(实体)类的 Maven 插件?

java - 如何用PHP搭建n层web架构?

java - 运行激活器运行时, Play Framework 未找到值routesGenerator

Java 流的误解......一些澄清?

java - 设置变量一次

c - 用户输入的类型数组

java - Java中动态数组的二维静态数组

javascript - 如何列出对象?

Java:如何在另一个类中使用一个类的 toString() 方法?

ios - 使用类中结构的函数