Java 将字符串输入转换为对象名称的实例(=输入)
我有很多类,我希望用户键入一个名称,他将得到一个特定对象(类)的同名实例。我通过以下代码将其简化:Java 将字符串输入转换为对象名称的实例(=输入),java,string,object,instanceof,Java,String,Object,Instanceof,我有很多类,我希望用户键入一个名称,他将得到一个特定对象(类)的同名实例。我通过以下代码将其简化: 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(i
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)
在最后一行,我实际上想将字符串名转换为类名的实例。有什么办法吗?
将会有很多动物,所以我不想写很多开关案例,比如:“if input equals to lion”或zebra或snake或…我建议在这里创建一个
工厂
类,为您创建合适的实例
例如:
public class AnimalFactory {
public Animal getAnimal(String input) {
if(input.equals("lion")) {
return new lion();
} else if(input.equals("zebra")) {
return new zebra();
}
}
}
我希望用户键入一个名称,他将得到一个特定对象(类)的同名实例
如果我没有错的话,这就是你想要的吗
返回与具有给定字符串名称的类或接口关联的类对象
我建议您将
Animal
作为一个抽象类,并引入一个AnimalFactory
来创建所需的类型(该工厂可能会使用开关)。您还可以引入枚举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
,从技术上讲,这应该适合您,这只是一个片段,不确定它是否有效,如果遇到问题,请添加注释,我会使它更通用
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();
Map classes=newhashmap();
class.put(“斑马”,zebra.class);
类。put(“lion”,lion.class);
类。put(“etc”,etc.class);
Animal aClass=classes.get(animalName.newInstance();
继续(它使用反射):
publicstaticanimalcreateanimal(字符串名){
试一试{
String package=“your.pkg”;//假设所有类都在同一个包中恢复
字符串fqn=包+“+”名称;
类animalClass=Class.forName(fqn);
return(动物)animalClass.newInstance();
}捕获(例外e){
return null;//在此处对任何异常作出反应
}
}
这个代码段要求所有动物子类都有一个默认构造函数。我想你想问的是,输入名称必须是类名,比如,如果用户输入lion,那么必须创建lion的实例。 如果是这种情况,那么必须使用java反射。 例如-Class cls=Class.forName(inputUserName)强> 这将为您提供所需的课程。 现在为类创建实例
Object clsInstance=(Object)cls.newInstance()如果(name.equals(“斑马”){…}或者如果(name.equals(“狮子”){…},情况如何?,你的问题不清楚。我试过了,也许我做错了什么,但没用。Object obj=Class.forName(“lion”).newInstance();eclipse说:此行有多个标记-未处理的异常类型InstanceionException-未处理的异常类型这是因为Class.forName().newInstance()抛出了多个需要捕获的异常。这段代码是在Eclipse中为我编译的:请尝试{Class.forName(“className”).newInstance();}catch(ClassNotFoundException | InstantiationException | IllegalAccessException e){//TODO自动生成的catch块e.printStackTrace();}
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();
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
}
}