2011-06-24 22 views
0

我有一个String数组,对应于我的一个包中的Classes名称。例如,可以说我有一个ArrayList,其中包含三个项目:“A1”,“A2”,“A3”。创建类<?>对象其中<?>被定义为ArrayList中的字符串<String> - Java

我想创建使用代码这些类如实例:

Class<?> objectToCreate = (Class<?>) MyStaticClass.class.getClassLoader().loadClass(objectToCreate); 
    <?> objectCreated = objectToCreate.newInstance(); 

这样,通过上面的代码行循环后,我将具有A1类的一个实例的一个实例一个A2类和一个A3类的一个实例。

有谁知道这是否可能?我意识到这是“让我Google为你”的领土,但我正在努力想到名词来查询这将给我答案!

+0

大约18个月后,我对此进行了重新审视。我现在看到,我的问题忽略了一个泛型集合包含“like”类型的基本性。在这种情况下,类型可能是一个不起眼的String,并且在答案中使用@ alphazero的建议,这可能会用于生成返回为String类型的实例。不过谢谢你,并且对于正确方向的引导来说也是如此。 – 8bitjunkie

回答

1

您需要将?设置为通配符以外的其他名称,这意味着它必须在某处定义。你的选择在方法或类上。我想到的方法都可以工作,所以尝试的方法包装这一点,就像这样:

public <T> T create(String name) { 
    Class<T> objectToCreate = (Class<T>) MyStaticClass.class.getClassLoader().loadClass(objectToCreate); 
    T objectCreated = objectToCreate.newInstance(); 
    return objectCreated; 
} 
+0

这就是我的问题,sblundy。我需要“T”与来自StringArray的字符串相同。无论如何Cast到一个字符串的值? – 8bitjunkie

+0

@ 7SpecialGems:是的,在某个时刻必须有演员阵容。你看,字符串没有与之相关的类型,至少从编译器的角度来看并不是。字符串只是一个字符串。 – sblundy

+0

也许我已经给了一个不好的例子 - 我会尝试另一个:class clazz = Class.forName(objectToCreate); Object obj = clazz.newInstance(); System.out.println(“Type:”+ obj.getClass()。getName());给我的类的类型。然而,为了编译器的好处,我需要从Object向下转换为此值,以便我可以调用obj特定的方法,而不是Object中的方法,例如obj.someSpecificMethod()。 – 8bitjunkie

1

可以使用

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

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

+0

Class clazz = Class足够快乐。forName(className)和Object obj = clazz.newInstance(),但是有没有什么方法可以从Object向下转换为与字符串“className”相同名称的对象类型? – 8bitjunkie

+0

这不是魔术,对吧? (正如你在sblundy的conv所注意到的那样)在编译时没有足够的信息来确定'T'。如果你真的没有超出类名的信息,那么你需要用一些字节代码工程来弄脏你的手,或者在运行时动态编译和创建工厂(在你编译的代码中正确的强制转换等等) – alphazero

相关问题