【问题标题】:Take in String and create object from class of that name [duplicate]接受字符串并从该名称的类中创建对象[重复]
【发布时间】:2013-11-15 16:51:36
【问题描述】:

假设我有两个不同的类来声明对象:Cat 类和 Dog 类。它们都是对象。

现在在我的主类中,我想接受一个字符串值(“狗”或“猫”),并创建一个该类型的对象。而且我不希望有案例,我正在寻找一种动态的方式来创建对象。

例如:

public static void main(String [] args){ 
       String object_name = "Dog"; 

 //this is where I want to dynamically create the object
       object_name bob = new object_name();
}

在这种情况下,它将创建一个变量名为 bob 的 Dog 对象。

感谢您的帮助。

编辑##

我用的方法:

public static Object generate(String type) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {


    Class<?> c = Class.forName(type);
    Constructor<?> ctor = c.getConstructor(String.class);
    Object object = ctor.newInstance("9");

    return object;
}

现在如果我在 main 中创建:

Object obj = generate("Dog");

如何调用 Dog 类中的方法?我必须将其转换为 Dog 吗?如果我必须投射它,它不会失去通过这种方法生成它的目的吗?再次感谢。

【问题讨论】:

  • 你想在更高的层次上实现什么?为什么一个对 Java 和程序内部一无所知的最终用户会输入 Java 类名?
  • 它的任务。
  • @user2991108 你需要给我们一个任务的描述,否则我们不能再帮你了。如果你能证明这个问题与被标记为重复的问题不同,那么我将重新投票。

标签: java object


【解决方案1】:

另一种方法是让CatDog 都实现/扩展Animal,然后执行以下操作:

public Animal fromString(String name) {
    switch (name.toLowerCase()) {
    case "dog":
        return new Dog();
    case "cat":
        return new Cat();
    default:
        return null;
    }
}

如果可能的话,我会尽量远离反思。

【讨论】:

  • 我本可以这样做,但我被限制不使用 Cases 或 If-statements。
  • @user2991108 限制为不使用 if 语句??!?!?什么?!?!?!
  • @user2991108 当你得到愚蠢的要求时,编写愚蠢的代码:while(condition){code; break;} 这将模拟一个 if 语句:)
  • 那是天才 ^ 也许我会试试这个。
【解决方案2】:

如果我理解正确的话,你可以这样做:

String className = "com.mypackage.Dog";
Class<?> myClass = Class.forName(className);
Dog dog = (Dog) myClass.newInstance();

【讨论】:

  • 只有在 Dog 中有一个没有参数的公共构造函数时才有效。
  • 你怎么知道这个对象应该是一只狗?这将破坏使用反射的全部意义。
  • 如果去掉强制转换,使用instanceof,可以检查。
  • 这种方法的最佳用途是您在编译时不知道它将是什么类,但您知道该类实现了某个接口。您可以使用 instanceof MyInterface 进行检查,然后进行强制转换。
  • @NickJ instanceof 需要一个 if 语句,我们已经知道这是不允许的
【解决方案3】:

您可以使用 Class.forName() 和 .newInstance() 来做到这一点,但除非您在编译时知道类名是什么,否则您将无法将其转换为所需的类型。所以你仍然会留下一个对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2014-12-23
    • 2018-08-11
    相关资源
    最近更新 更多