Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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
创建类<&燃气轮机;对象,其中<&燃气轮机;定义为ArrayList中的字符串<;字符串>;-JAVA_Java_Generics_Classloader - Fatal编程技术网

创建类<&燃气轮机;对象,其中<&燃气轮机;定义为ArrayList中的字符串<;字符串>;-JAVA

创建类<&燃气轮机;对象,其中<&燃气轮机;定义为ArrayList中的字符串<;字符串>;-JAVA,java,generics,classloader,Java,Generics,Classloader,我有一个字符串数组,它对应于我的一个包中的类名 例如,假设我有一个ArrayList,其中包含三项:“A1”、“A2”、“A3” 我想使用以下代码创建这些类的实例: Class<?> objectToCreate = (Class<?>) MyStaticClass.class.getClassLoader().loadClass(objectToCreate); <?> objectCreated = objectToCreate.newIn

我有一个字符串数组,它对应于我的一个包中的类名

例如,假设我有一个ArrayList,其中包含三项:“A1”、“A2”、“A3”

我想使用以下代码创建这些类的实例:

    Class<?> objectToCreate = (Class<?>) MyStaticClass.class.getClassLoader().loadClass(objectToCreate);
    <?> objectCreated = objectToCreate.newInstance();
Class objectToCreate=(Class)MyStaticClass.Class.getClassLoader().loadClass(objectToCreate);
objectCreated=objectToCreate.newInstance();
这样,在循环上述代码行之后,我将有一个A1类的实例、一个A2类的实例和一个A3类的实例


有人知道这是否可能吗?我意识到这是一个“让我为你谷歌一下”的领域,但我很难想出一个可以给我答案的名词

您需要
不是通配符,这意味着它必须在某个地方定义。您的选项在方法或类上。我希望该方法能起作用,所以请尝试将其包装到一个方法中,如下所示:

public <T> T create(String name) {
   Class<T> objectToCreate = (Class<T>) MyStaticClass.class.getClassLoader().loadClass(objectToCreate);
   T objectCreated = objectToCreate.newInstance();
   return objectCreated;
}
public T创建(字符串名称){
类objectToCreate=(类)MyStaticClass.Class.getClassLoader().loadClass(objectToCreate);
T objectCreated=objectToCreate.newInstance();
返回已创建的对象;
}

您只需使用

Class<?> clazz = Class.forName(classname);
Class clazz=Class.forName(classname);

如果您的类提供了一个公共的无参数构造函数,那么您当然可以使用
newInstance()
。或者,您可以获取所有可用的构造函数,并使用适当的参数调用ctor。

对clazz=Class.forName(className)和obj=clazz.newInstance()类足够满意,但是有没有办法将对象向下转换为与字符串“className”同名的对象类型?这不是魔术,对吗?(正如您与sblundy的conv中所指出的)没有足够的信息在编译时确定“t”。如果你真的没有类名称以外的信息,那么你需要用字节码工程或者动态编译,在运行时生成工厂(编译的代码中有正确的强制转换,等等),这就是我的问题,sblundy。我需要“T”与StringArray中的字符串相同。是否还有转换为字符串值的方法?@7SpecialGems:是的,在某个时候必须有转换。你看,字符串没有与之关联的类型,至少从编译器的角度看不是这样。这个字符串只是一个字符串。也许我给出了一个不好的例子——我将尝试另一个:Class clazz=Class.forName(objectToCreate);Object obj=clazz.newInstance();System.out.println(“类型:”+obj.getClass().getName());给了我班级的类型。但是,为了编译器的利益,我需要从Object向下转换为这个值,这样我就可以调用特定于obj的方法,而不是在Object中,例如obj.someSpecificMethod()。@7SpecialGems:Yep,您仍然需要转换。obj的类型是编译器无法确定的。这就是反思的好处和代价。@alphazero:我也注意到了。Foo f=this.create(“Foo”);应该是安全的,但和演员一样冗长。大约18个月后,我又重温了这一点。我现在看到,我的问题忽略了一个基本点,即具有泛型的集合包含“like”类型。本例中的类型可能是一个简陋的字符串,在答案中使用@alphazero的建议,可以用来生成作为字符串返回的类型的实例。不过,也要感谢sblundy在正确方向上的转向。