(JavaFX)如何在构造函数和initialize()之间调用类的方法?

(JavaFX)如何在构造函数和initialize()之间调用类的方法?,java,reflection,javafx,interface,fxml,Java,Reflection,Javafx,Interface,Fxml,我有一个实现接口的类。在我的基类中,我创建了一个实现类的实例,如下所示: Class newTab; TransactionTabInterface tabInterface = null; try { newTab = Class.forName("[package] + title); tabInterface = (TransactionTabInterface) newTab.newInstance(); tabInterface.setRootController(this

我有一个实现接口的类。在我的基类中,我创建了一个实现类的实例,如下所示:

Class newTab;
TransactionTabInterface tabInterface = null;
try {
  newTab = Class.forName("[package] + title);
  tabInterface = (TransactionTabInterface) newTab.newInstance();
  tabInterface.setRootController(this);
} catch (Exception e) {
   e.printStackTrace();
}
这是必要的,因为我不知道需要实例化的类的名称(
title
在别处确定)

我遇到的问题是,在新类中,我需要立即访问
rootController
。我在类中有一个方法,允许我传递
rootController
引用,如上面代码所示

通常,在实例化类时,我会将
rootController
传递给构造函数,但我不知道如何在上面的
newInstance()
调用中将参数传递给构造函数


EDIT:要清楚,上面的代码在我的主类中,用于实例化一个新的FXML控制器(newTab)。

newTab
对象上,您可以使用构造函数的类型调用
getConstructor(class…
,以获得对该构造函数的引用以及所需的参数


然后,您可以调用此构造函数的
newInstance(Object…
方法来调用带参数的构造函数。

newTab
对象上,您可以使用构造函数的类型调用
getConstructor(Class…
,以获得对该构造函数的引用,其中包含所需的参数


然后,您可以调用此构造函数的
newInstance(Object…
方法来调用带参数的构造函数。

正确的答案是通过反射调用相应的构造函数(如下面p.J.Meisch的回答)。但需要注意的是,假设这是一个与FXML文件关联的控制器,
initialize()
方法在调用
FXMLLoader.load()
之前不会被调用,因此上面的代码将实现在“构造函数和initialize()之间”设置根控制器的目的@James_D我发布的代码实际上不是FXMLs控制器的一部分。我的FXML由包含
setRootController
方法的控制器加载。我的意思是您实例化的控制器是FXML文件的控制器,但我假设您稍后加载FXML(不是在控制器的构造函数中)。您始终可以在“setRootController”方法中加载FXML作为一种变通方法/破解方法,但正确答案如下。正确答案是通过反射调用适当的构造函数(如下面P.J.Meisch的答案)。但需要注意的是,假设这是一个与FXML文件关联的控制器,
initialize()
方法在调用
FXMLLoader.load()
之前不会被调用,因此上面的代码将实现在“构造函数和initialize()之间”设置根控制器的目的@James_D我发布的代码实际上不是FXMLs控制器的一部分。我的FXML由包含
setRootController
方法的控制器加载。我的意思是您实例化的控制器是FXML文件的控制器,但我假设您稍后加载FXML(不是在控制器的构造函数中)。您可以始终在`setRootController`方法中加载FXML,作为一种变通/破解方法,但正确答案如下。谢谢您的回答,@P.J.Meisch。你能详细说明一下吗?如果我不知道我正在实例化的对象的名称,那么我就不知道调用它的构造函数的类型,对吗?我确实编辑了我的问题,以明确我试图从何处调用它。@Zephyr
getConstructor
方法是
Class
的一种方法。因此,您可以通过
newTab.getConstructor(…).newInstance(this)
this
反射传递给构造函数。这仍然是反射,您不需要知道类名。请阅读相关的Javadocs。感谢您的回复@James_D。我想让我感到困惑的是在我找到的示例
(…)
中遗漏的代码。其余部分对我来说很有意义,但我不确定
getConstructor()
在参数方面需要什么。我一直在阅读关于它的Javadocs,只看到
Class…
再次省略了代码。您试图检索的构造函数的参数类型。比如说“parameterTypes参数是一个类对象数组,它以声明的顺序标识构造函数的形式参数类型。”我不确定我能不能说得更清楚。如果您有一个构造函数,其类型为
RootController
,那么您将执行
newTab.getConstructor(RootController.class).newInstance(this)
,当然假设
this
RootController
的一个实例。谢谢您的回答,@P.J.Meisch。你能详细说明一下吗?如果我不知道我正在实例化的对象的名称,那么我就不知道调用它的构造函数的类型,对吗?我确实编辑了我的问题,以明确我试图从何处调用它。@Zephyr
getConstructor
方法是
Class
的一种方法。因此,您可以通过
newTab.getConstructor(…).newInstance(this)
this
反射传递给构造函数。这仍然是反射,您不需要知道类名。请阅读相关的Javadocs。感谢您的回复@James_D。我想让我感到困惑的是在我找到的示例
(…)
中遗漏的代码。其余部分对我来说很有意义,但我不确定
getConstructor()
在参数方面需要什么。我一直在阅读关于它的Javadocs,只看到
Class…
再次省略了代码。您试图检索的构造函数的参数类型。say“parameterTypes参数是一个类对象数组,用于标识构造函数的形式参数t