很难找到这个问题因为我不完全确定如何定义它。请耐心等待。
我能说的最好的问题是:在Java中,如何创建通过多态在运行时定义类的变量,而不是在代码中预定义?
也许我可以通过例子来最好地定义这个:假设我有一个抽象的超类超级英雄,子类是Thug,Psionic,Shooter和Gadgeteer。我想从CSV数据文件中读取,其行条目是单独的超级英雄;在变量中,每个超级英雄的文件列表是它们所属的类。我怎样才能将每个超级英雄分配到文件中列出的类?到目前为止我所做的包括以下内容。
我创建了一个子类类型数组,如下所示:
numberOfClasses = 4; // constant
Superhero[] heroType = new Superhero[numberOfClasses];
heroType[0] = new Thug();
heroType[1] = new Psionic();
heroType[2] = new Shooter();
heroType[3] = new Gadgeteer();
然后我们有一个遍历文件每一行的for循环。对于每一行,它将英雄的名称读入变量tempClassName,然后开始执行此操作的嵌套循环:
for (int index=0; index<numberOfClasses; index++)
{
Class heroClass = heroType[index].getClass();
if (tempClassName.equals(heroClass.getName()))
{
Superhero newHero = new heroClass; // problem line
}
}
最后一个问题行应该创建一个新的Superhero对象,其子类是变量heroClass中的任何内容。但你可能会发现这不起作用。将其定义为“new heroClass”会产生语法错误,因为它需要一个方法heroClass()。但是“new heroClass()”也是一个问题,因为heroClass不是一个方法。基本上,我如何使用getClass()的结果作为我新创建的变量的(子)类类型?我是否需要对每个子类中的构造函数执行某些操作?
答案 0 :(得分:1)
Superhero[] heroType = new Superhero[]{
new Thug(),
new Psionic(),
new Shooter(),
new Gadgeteer()
};
for (int index = 0; index < heroType.length; index++) {
Class heroClass = heroType[index].getClass();
if (tempClassName.equals(heroClass.getName())) {
Superhero newHero = (Superhero) heroClass.newInstance();
}
}
答案 1 :(得分:1)
假设您有班级名称className[]
for(int i =0;i<className.length;i++)
{
SuperHero superHero = (SuperHero)Class.forName("PACKAGE_NAME" + className[i]).newInstance();
//use this superhero where you want. you can also save this superhero in ArrayList of type SuperHero.
}
答案 2 :(得分:0)
假设你确定这种反射是个好主意,你可以做
heroClass.newInstance();