【问题标题】:(JavaFX) How to call method of class between constructor and initialize()?(JavaFX)如何在构造函数和initialize()之间调用类的方法?
【发布时间】:2016-08-04 19:58:45
【问题描述】:

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

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() 调用中将参数传递给构造函数。

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

【问题讨论】:

  • 正确的答案是通过反射调用适当的构造函数(如下面的 P.J.Meisch 的回答)。但请注意,假设这是一个与 FXML 文件关联的控制器,在调用 FXMLLoader.load() 之前不会调用 initialize() 方法,因此您上面的代码将实现在构造函数和初始化()“。
  • @James_D 我发布的代码实际上并不是 FXMLs 控制器的一部分。我的 FXML 由包含 setRootController 方法的控制器加载。
  • 我的意思是您要实例化的控制器是 FXML 文件的控制器,但我假设您稍后会加载 FXML(而不是在控制器的构造函数中)。您始终可以在 `setRootController` 方法中加载 FXML 作为解决方法/hack,但正确答案如下。

标签: java reflection javafx interface fxml


【解决方案1】:

在您的newTab 对象上,您可以使用构造函数的类型调用getConstructor(Class<?>...),以获取对该构造函数的引用以及所需的参数。

然后就可以调用这个构造函数的newInstance(Object...)方法来调用带参数的构造函数了。

【讨论】:

  • 谢谢你的回答,@P.J.Meisch。你能详细说明一下吗?如果我不知道我正在实例化的对象的名称,那么我就不会知道构造函数的类型来调用它,对吗?我确实编辑了我的问题,以明确我试图从哪里调用它。
  • @Zephyr getConstructor 方法是Class 的方法。所以你做newTab.getConstructor(...).newInstance(this) 反射性地将this 传递给构造函数。仍然都是反射,你不需要知道类名。只需阅读相关的 Javadocs。
  • 感谢@James_D 的回复。我想我感到困惑的部分是我找到(...) 的示例中省略的代码。其余的对我来说很有意义,但我不确定getConstructor() 在参数方面正在寻找什么。我一直在阅读它上面的 Javadocs 并再次看到 Class<?>... 省略了代码。
  • 您尝试检索的构造函数的参数类型。 Javadocs 说“parameterTypes 参数是一个 Class 对象数组,它按照声明的顺序标识构造函数的形式参数类型。”不知道我能不能把它说得更清楚。
  • 例如如果你有一个带有RootController 类型参数的构造函数,那么你会做newTab.getConstructor(RootController.class).newInstance(this),当然假设this 是RootController 的一个实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 2011-08-28
  • 2015-08-20
  • 1970-01-01
  • 2016-05-31
  • 2018-07-12
  • 2012-05-19
相关资源
最近更新 更多