创建匿名控制器的实例并使用其方法

时间:2015-03-31 07:40:48

标签: java reflection javafx

亲爱的主席,早上好。

Java中有一种方法可以创建匿名类的实例:

Class<?> c = Class.forName("class name");
Method  method = c.getDeclaredMethod ("method name", parameterTypes)
method.invoke (objectToInvokeOn, params)

如果我希望制作新的JavaFX控制器实例,我会这样做:

FXMLLoader loader = new FXMLLoader(getClass().getResource(
           "MyClass.fxml"));
MyClassCtrl ctrl = loader.getController();
Parent root = (Parent) loader.load();
ctrl.methodNameOfMyClassCtrl();

但现在我有一个例子,我需要做控制器的实例并使用他们的方法,这些在编码时是未知的。它们在运行时被识别,取决于用户点击了哪个Button。

所以我需要的是上面描述的两种技术的组合。现在我做了以下,但它不起作用。

String methodName = "myMethod";
String className = "MyController";

FXMLLoader loader = new FXMLLoader(getClass().getResource( className + ".fxml" ));
Class c = Class.forName(className);
loader.setController(c);
Parent root = (Parent) loader.load();
Method m = c.getDeclaredMethod(methodName, null);
m.invoke(null, null);

我怀疑,我是第一个尝试这样的事情 - 所以你们是我最后的机会。

谢谢和最诚挚的问候 埃尼斯

1 个答案:

答案 0 :(得分:0)

如果您真的想将反射API与控制器混合使用,请参阅此

String methodName = "myMethod";
String className = "MyController";

FXMLLoader loader = new FXMLLoader(getClass().getResource( className + ".fxml" ));
Class c = Class.forName("mypackage." + className);
Object obj = c.newInstance();
loader.setController(obj);
Parent root = (Parent) loader.load();
Method m = c.getDeclaredMethod(methodName);
m.invoke(obj);

但请记住,反思可能会降低您的应用速度,并且重构可能很难。如果你解释你的用例,可以采用其他方法使用OOP,如继承。