我通过(Classname.class
)存储一个类列表,并希望实例化一个类?这可能吗?
newInstance
似乎是我正在使用的方法,但它不支持构造函数?
答案 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)来加载/引用类。
如果您有要创建的类的字节代码,则可以让类加载器加载字节代码并为您提供类。这可能比你想象的更先进。