在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));