Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符串输入转换为对象名称的实例(=输入)_Java_String_Object_Instanceof - Fatal编程技术网

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
    }
}