如何创建在运行时知道的类的实例?

  1. 我们如何使用参数化构造函数创建类的对象,并且类的名称将在运行时作为命令行参数提供给我们。

  2. 这条线意味着什么

    new Class [] {String.class}

  3. 和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对象,它表示一个带有一个参数的构造函数,它是一个Stringnew Class[] {String.class}构造一个带有单个条目的Class[] ,它是表示java.lang.StringClass对象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是实例化时要使用的参数的实际值。