我如何使用getConstructor(params).newInstance(args)?

这可能是一个愚蠢的问题,但我是Java的新手,所以……

我目前有一些代码,目前正在使用clazz.asSubclass(asSubclassOfClass).getConstructor().newInstance()

我需要将一些参数传递给contructort,所以我想将其更改为: clazz.asSubclass(asSubclassOfClass).getConstructor(params).newInstance(args)

我不明白的是我需要传递的是params以及我需要传递给args的东西

假设我想传入一个字符串“你好”和一些名为XyzObj的XYZ类型的对象。我该如何指定? 我会以params的forms通过什么,以及作为args传递给我的是什么?

在Java中,这称为reflection 。

假设该类具有此构造函数,否则您将获得我认为的NoSuchMethodexception。

 clazz.asSubclass(asSubclassOfClass) .getConstructor(String.class,XYZ.class) .newInstance("howdy",XyzObj); 

由于您不熟悉Java,所以让我更轻松一些,这样您就可以了解当您执行此操作时会发生什么。

假设您有以下课程:

 public class ParentClazz{ String someVar; public ParentClazz(){ someVar="test"; } public ParentClazz(String someVar){ System.out.println("I have been invoked"); this.someVar=someVar; } } 

然后你有以下主要方法:

 public static void main(String[] args) throws ParseException, IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { ParentClazz.class.asSubclass(ParentClazz.class).getConstructor(String.class).newInstance("howdy"); } 

如果你运行它,你会注意到控制台输出打印消息 – 我已被调用。 这意味着使用reflection调用了ParentClazz的构造函数。

如果场景允许您使用标准对象创建过程,则可以执行相同的操作:

 ParentClazz clazz = new ParentClazz("howdy"); 

希望这有助于您理解它。

以下是使用new关键字创建类的示例。 这些类将其他类(基元和对象)作为其参数。 该示例还显示了正在创建的子类和Parent类的实例

 public class ConstructorInstantiateWithoutNew { @SuppressWarnings("rawtypes") public static void main( String [] args ) { Class clazz_drinker = Drinker.class; Class [] paramTypes = { Fizz.class, Colour.class, int.class }; Object [] paramValues = { new Fizz(), new Colour(), new Integer(10) }; Class clazz_drunk = Drunk.class; Class [] paramTypesSub = { Fizz.class, Colour.class, int.class, boolean.class }; Object [] paramValuesSub = { new Fizz(), new Colour(), new Integer(10), true }; try { Drinker drinker = clazz_drinker.getConstructor( paramTypes ).newInstance( paramValues ); drinker.drink(); Drunk drunk = clazz_drunk.getConstructor(paramTypesSub).newInstance(paramValuesSub); drunk.drink(); } catch (Exception e) { e.printStackTrace(); } } } class Drinker { int n; public Drinker( Fizz f, Colour c, int n) { this.n = n; } public void drink() { System.out.println( "Dad drank " + (n*10) + " ml"); } } class Drunk extends Drinker { boolean trouble; public Drunk(Fizz f, Colour c, int n, boolean inDogHouse) { super(f,c,n); trouble = inDogHouse; } public void drink() { System.out.println( "Dad is Grounded: " + trouble + " as he drank over "+ (n*10) + " ml"); } } class Fizz {} class Colour {} 

希望这很有用

亲切的问候

Naresh Maharaj

 clazz.asSubclass(asSubclassOfClass) .getConstructor(String.class, XYZ.class) .newInstance("howdy", XyzObj) 

假设构造函数args按指定的顺序排列

你会用的

 clazz.asSubclass(asSubclassOfClass) .getConstructor(String.class, XYZ.class) .newInstance("howdy", XyzObj);`