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

12 java reflection

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

newInstance 似乎我的方法,但它不支持构造函数?

and*_*dri 42

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


小智 10

只是添加一点,我看到缺失:

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

否则,您可以Class.getConstructors()像其他人所说的那样找到构造函数.


小智 7

反思的Java 教程很好地涵盖了这一点.但是,基本上是Class.getConstructors,然后是Constructor.newInstance就在它的位置.


Hug*_*ugo 5

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

因此,使用 Class.forName("me.Test").newInstance(); (或类似的)将在后台为您调用 Test() 构造函数。

如果你想调用另一个构造函数,代码如下:

Test test = (Test)Class.forName("Test").getConstructor(String.class).newInstance("Hello World");
Run Code Online (Sandbox Code Playgroud)

这里 getConstructor 询问构造函数是什么样的(它需要一个字符串),然后你用一个字符串调用它。


Pet*_*rey 3

你不能用这种方式构造新类。

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

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

  • 他问的是如何实例化类的新实例,而不是创建 Class 对象(也不是如何获取字节码)。这不应被标记为正确答案。继续阅读下面安德里的回答。 (3认同)
  • @RyanShillington 这回答了原来的问题。该问题被编辑为另一个问题,这就是“andri”的回答。 (2认同)