【发布时间】: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