Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/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_Class_Object_Dynamic - Fatal编程技术网

在java中动态实例化对象

在java中动态实例化对象,java,class,object,dynamic,Java,Class,Object,Dynamic,我不知道我的标题是否正确,但是,我正在寻找一种基于用户输入实例化子类的新对象的方法。也就是说,我想问用户他们想要创建什么子类,然后根据这个选择创建它。所以看起来像 String category = CATEGORIES[Integer.parseInt(scanner.nextLine())]; items.add(new category(myString, myInt)); 我正在将这些添加到ArrayList中 这个新关键字似乎只接受一个实际的类,而不接受其他任何东西。我曾尝

我不知道我的标题是否正确,但是,我正在寻找一种基于用户输入实例化子类的新对象的方法。也就是说,我想问用户他们想要创建什么子类,然后根据这个选择创建它。所以看起来像

 String category = CATEGORIES[Integer.parseInt(scanner.nextLine())];   
 items.add(new category(myString, myInt));
我正在将这些添加到ArrayList中

这个新关键字似乎只接受一个实际的类,而不接受其他任何东西。我曾尝试过使用内置类方法,但当我尝试在新调用之后放置这些方法时,它失败了。除了类本身失败之外,我在新调用之后放置的几乎所有内容

这是可能的吗


谢谢

您正在查找反射,以及
Class.forName()
Class.forName().newInstance()

看:

有一个例子

再看看:

我不建议这样做,但反射也可以:

Object thing = Class.forName(category).getConstructor().newInstance();
这将获取名称存储在
类别
中的类,获取其无参数构造函数,并调用它,将生成的
对象
存储在
对象

这里可能会出很多问题;仅当以下情况均不成立时,此选项才有效:

  • 没有具有给定名称的类
  • 用户说的是类似“String”的内容,而不是“java.lang.String”
    Class.forName(字符串s)
    仅适用于完全限定名
  • 该类没有空构造函数(不带参数的构造函数)
另外,正如有人提到的,这是一件非常不安全和不稳定的事情。

试试这个

public class Category {}
public class Foo extends Category { public Foo(String s, int i) {}}
public class Bar extends Category { public Bar(String s, int i) {}}
String[] CATEGORIES = { Foo.class.getName(), Bar.class.getName() };
static final Class<?>[] ARGTYPES = { String.class, int.class };
公共类类别{}
公共类Foo扩展了类别{public Foo(String s,int i){}
公共类Bar扩展了类别{public Bar(字符串s,int i){}
String[]CATEGORIES={Foo.class.getName(),Bar.class.getName()};
静态最终类[]ARGTYPES={String.Class,int.Class};

List items=new ArrayList();
String category=CATEGORIES[Integer.parseInt(scanner.nextLine())];
items.add((类别)Class.forName(类别)
.getConstructor(ARGTYPES)
.newInstance(myString,myInt));

您正在寻找反射。您可以。或者您可以使用switch语句。询问用户您必须实例化哪个类并不是真正安全的!查看工厂设计模式。它应该能帮你找到你想要的东西。我只是想换个位置。我知道我可以用,我只是在寻找一个“更干净”的方式,但反射的事情看起来更复杂。谢谢大家!我明白这是什么意思,但我不清楚如何让它真正起作用。如果我的子类上有构造函数,这个方法仍然有效吗?如果我有一个需要字段的构造函数,有没有办法做到这一点?是的。看看这里的Javadocs:这里:
List<Category> items = new ArrayList<>();
String category = CATEGORIES[Integer.parseInt(scanner.nextLine())];   
items.add((Category)Class.forName(category)
    .getConstructor(ARGTYPES)
    .newInstance(myString, myInt));