一尘不染

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

java

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

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

我需要将一些参数传递给构造函数,因此我想将其更改为:
clazz.asSubclass(asSubclassOfClass).getConstructor(params).newInstance(args)

我不明白的是,我需要以 参数形式 传递什么,我需要以 args 传递什么。

假设我想传入一个字符串“ howdy”和一些名为XyzObj的XYZ类型的对象。我该如何指定呢?我将通过什么作为参数,而将通过什么作为参数?


阅读 282

收藏
2020-12-03

共1个答案

一尘不染

在Java中,这称为Reflection

假设该类具有此构造函数,否则我相信您将获得NoSuchMethod异常。

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");
    }

如果运行此命令,您会注意到控制台输出打印消息-我已被调用。这意味着您使用反射调用了ParentClazz的构造函数。

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

ParentClazz clazz = new ParentClazz("howdy");

希望这可以帮助您理解。

2020-12-03