从Java中获取用户的类的对象名称

时间:2014-04-06 11:05:54

标签: java class object dynamic hashmap

我希望用户输入要在代码中使用的对象的名称。例如,如果我有一个班级

public class Person{ 
.......
}

现在而不是我创建一个具有特定名称的对象,如

Person student;

我希望用户输入对象的名称,可能就像老师一样,然后将创建班级人员的对象教师。 我不知道在java中是否甚至可以实现这一点,我查找的许多解决方案都使用了地图,但由于我是java新手,因此解释不够明确。

所以,如果有人能解释如何使用代码片段来完成它,那就太棒了。

另外请解释hashmaps如何在java中工作,以及它们是否可用于实现上述问题。如果用代码示例解释,我将非常感激

1 个答案:

答案 0 :(得分:2)

这是不可能的。局部变量的名称在编译的Class文件中甚至不是持久的。字段的名称在那里,因为它是API的一部分,但您必须修改类文件运行时 - 这不是您想要的。

使用Hashtable,可以这样做:

Hashtable<String, Person> hashtable = new Hashtable<>();
hashtable.put("student", new Person());

然后你可以得到你的变量&#34;由:

Person person = hashtable.get("student");

当我猜你想要做什么时,这是一个更有用的例子:

import java.util.Hashtable;
import java.util.Scanner;

public class Test {
    public static class Person {
        public final String name;
        public final int    age;

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

        @Override
        public String toString() {
            return "Name: " + name + ", age: " + age;
        }
    }

    public static class PersonsList {
        private Hashtable<String, Person> persons = new Hashtable<String, Test.Person>();

        public void addPerson(Person person) {
            this.persons.put(person.name, person);
        }

        public Person findPerson(String name) {
            return persons.get(name);
        }

        @Override
        public String toString() {
            return persons.toString();
        }
    }

    public static void main(String[] args) {
        PersonsList personsList = new PersonsList();
        Scanner     scanner     = new Scanner(System.in);

        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();

            if (line.equals("END")) {
                break;
            }

            try {
                String[] parts = line.split(" ");
                String name    = parts[0];
                int    age     = Integer.valueOf(parts[1]);

                personsList.addPerson(new Person(name, age));
            } catch (NumberFormatException e) {
                System.out.println("Age must be an decimal non-floating-point number.");
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("You must enter both name and age");
            }
        }

        scanner.close();
        System.out.println(personsList);
    }
}