我有很多类,我希望用户输入一个名称,他将获得一个特定对象(类)的同名实例。我用这段代码简化了它:
public class Animal {...}
public class lion extends Animal{...}
public class zebra extends Animal{...} // and so on for a lot of animals
String name = input from user
Animal something = new Animal(instance of the input name)
在最后一行,我实际上想将字符串名称转换为类名的实例。有什么办法吗? 会有很多动物,所以我不想写很多开关案例:“如果输入等于狮子”或斑马或蛇或......
答案 0 :(得分:2)
我希望用户输入一个名称,他将获得一个特定对象(类)的相同名称的实例。
Class.forName()
正是您要找的,如果我没错?
返回与具有给定字符串名称的类或接口关联的Class对象。
Object obj = Class.forName(user_enterd_name).newInstance();
答案 1 :(得分:1)
我建议在这里创建一个Factory
类,为您创建合适的实例
例如:
public class AnimalFactory {
public Animal getAnimal(String input) {
if(input.equals("lion")) {
return new lion();
} else if(input.equals("zebra")) {
return new zebra();
}
}
}
答案 2 :(得分:1)
使用它(它使用反射):
public static Animal createAnimal(String name) {
try {
String package = "your.pkg"; // assuming all classes resume in the same package
String fqn = package + "." + name;
Class<?> animalClass = Class.forName(fqn);
return (Animal) animalClass.newInstance();
} catch (Exception e) {
return null; // react to any exception here
}
}
此代码段要求所有动物子类都具有默认构造函数。
答案 3 :(得分:0)
我建议你让Animal
成为一个抽象类,并引入一个AnimalFactory
来创建所需的类型(这个Factory可以使用一个开关)。你也可以引入一个枚举AnimalTypes
而不是你的字符串表示。
public class AnimalFactory {
public Animal create(AnimalType animal) {
switch (animal) {
case lion: return new lion(); break;
case dog: return new dog(); break;
default: break;
}
}
}
你的'动物'都扩展了抽象类Animal
。
答案 4 :(得分:0)
从技术上讲,这应该适合你,这只是一个片段,不确定它是否有效,如果你遇到问题,添加评论,我会让它更通用
Map<String, Class> classes = new HashMap<>();
classes.put("zebra", Zebra.class);
classes.put("lion", Lion.class);
classes.put("etc", Etc.class);
Animal aClass = classes.get(animalName).newInstance();
答案 5 :(得分:0)
我想你要问的是输入名称必须是类名,如果用户输入lion,则必须创建lion的实例。 如果这是条件,那么你必须使用java反射。 例如 - Class cls = Class.forName(inputUserName); 这将为您提供所需的课程。 现在为类创建实例 Object clsInstance =(Object)cls.newInstance();