我可以使用类对象实例化一个类吗?那么构造函数呢?

时间:2009-04-03 02:38:29

标签: java reflection

我通过(Classname.class)存储一个类列表,并希望实例化一个类?这可能吗?

newInstance似乎是我正在使用的方法,但它不支持构造函数?

6 个答案:

答案 0 :(得分:41)

您可以使用Class.getConstructors(或Class.getConstructor)获取可用构造函数的列表,并使用Constructor.newInstance调用其中的任何一个,它接受参数。

答案 1 :(得分:9)

只是添加一个我看不见的点:

如果newInstance对象具有公共空构造函数,则可以直接在Class对象上调用Class.getConstructors()。 (Null构造函数是没有参数的构造函数。)

否则,您可以通过{{1}}找到构造函数,正如其他人所说的那样。

答案 2 :(得分:6)

Java tutorial on reflection涵盖了这一点。但是,基本上是Class.getConstructors,然后是Constructor.newInstance就在它的位置。

答案 3 :(得分:2)

Java的设计使您只要使用java.lang / java就可以“欺骗”它。类或其他标准库。 OOP最重要的事情之一是对象应该处于已定义的状态,因此您可以安全地始终运行构造函数。即使你使用一些看起来很奇怪的反射库来完成你的工作。

所以,使用Class.forName(“me.Test”)。newInstance(); (或类似的)将在引擎盖下为你调用Test()构造函数。

如果要调用另一个构造函数,代码类似于:

Test test = (Test)Class.forName("Test").getConstructor(String.class).newInstance("Hello World");

这里getConstructor询问构造函数的样子(它想要一个字符串),然后用字符串调用它。

答案 4 :(得分:1)

如果你有一个通过类文字获得的Class个对象的列表,你也可以静态地引用构造函数,而不是陷入反思邪恶。

答案 5 :(得分:1)

你无法以这种方式构建新类。

如果您有类的名称,则可以使用Class.forName(className)来加载/引用类。

如果您有要创建的类的字节代码,则可以让类加载器加载字节代码并为您提供类。这可能比你想象的更先进。