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

时间:2014-03-17 17:33:19

标签: java reflection

  1. 我们如何创建具有参数化的类的对象 构造函数,类的名称将在给我们 运行时命令行参数。

  2. 这一行是什么意思

    new Class [] {String.class}

  3. 和String和String.class有什么区别?

3 个答案:

答案 0 :(得分:0)

  

Class c = Class.forName(args [0]);

这会得到一个Class<?>对象......

  

构造函数ctr = c.getDeclaredConstructor(new Class [] {String.class})

,这将获得该类的构造函数,该参数是单个String。

完成后,您可以调用ctr.newInstance(someString)

你有一个问题,因为你真的不知道这里的课程。你应该至少知道一个共同的子类型,否则你所得到的只是Object ......

答案 1 :(得分:0)

Class.getDeclaredConstructor的JavaDoc非常清楚:

  

返回一个Constructor对象,该对象反映此Class对象所表示的类或接口的指定构造函数。 parameterTypes参数是Class个对象的数组,用于按声明的顺序标识构造函数的形式参数类型。

...所以在你的情况下,它得到一个Constructor对象,它代表一个带有一个参数的构造函数,这是一个Stringnew Class[] {String.class}构造一个Class[]单个条目,它是表示Class的{​​{1}}个对象。您可以在该对象上调用java.lang.String以调用构造函数并返回目标类的新实例。

在实践中,您可能需要使用newInstance("some string")而不是getConstructor,因为后者将返回与指定参数类型匹配的任何构造函数,包括通常不会可从外部访问(例如getDeclaredConstructor个)。相反,private只返回getConstructor个构造函数。

答案 2 :(得分:0)

1-使用反射在运行时创建类实例:

Class classToInstantiate = Class.forName(className);
Constructor<?> theClassInstructor = classToInstantiate.getDeclaredConstructor(<parametersClasses>);
Object instance = theClassInstructor.newInstance(<parameters>);

使用:

  • parametersClasses构造函数参数的类数组,例如,如果构造函数使用您编写的String和Integer参数:getDeclaredConstructor(new Class[]{String.class,Integer.class});
  • parameters是实例化时要使用的参数的实际值。