如何创建在运行时知道的类的实例?
-
我们如何使用参数化构造函数创建类的对象,并且类的名称将在运行时作为命令行参数提供给我们。
-
这条线意味着什么
new Class [] {String.class}
-
和String.class有什么区别?
类c = Class.forName(args [0]);
这会得到一个Class>
对象……
构造函数ctr = c.getDeclaredConstructor(new Class [] {String.class})
这将获得该类的构造函数,该参数是单个String。
一旦你有了,你可以调用ctr.newInstance(someString)
。
你有一个问题,因为你真的不知道这里的课程。 你应该至少知道一个共同的子类型,否则你所得到的只是一个Object
……
Class.getDeclaredConstructor
JavaDoc非常清楚:
返回一个
Constructor
对象,该对象反映此Class
对象所表示的类或接口的指定构造函数。parameterTypes
参数是一个Class
对象数组,它按声明的顺序标识构造函数的forms参数类型。
…所以在你的情况下它得到一个Constructor
对象,它表示一个带有一个参数的构造函数,它是一个String
( new Class[] {String.class}
构造一个带有单个条目的Class[]
,它是表示java.lang.String
的Class
对象java.lang.String
)。 您可以在该对象上调用newInstance("some string")
以调用构造函数并返回目标类的新实例。
在实践中,您可能需要使用getConstructor
而不是getDeclaredConstructor
因为后者将返回与指定参数类型匹配的任何构造函数,包括通常无法从外部访问的构造函数(例如private
的)。 相反, getConstructor
只返回public
构造函数。
1-使用reflection在运行时创建类实例:
Class classToInstantiate = Class.forName(className); Constructor> theClassInstructor = classToInstantiate.getDeclaredConstructor(); Object instance = theClassInstructor.newInstance();
附:
-
parametersClasses
构造函数参数的类数组,例如,如果构造函数使用您编写的String和Integer参数:getDeclaredConstructor(new Class[]{String.class,Integer.class});
-
parameters
是实例化时要使用的参数的实际值。