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);
我怀疑,我是第一个尝试这样的事情 - 所以你们是我最后的机会。
谢谢和最诚挚的问候 埃尼斯
答案 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,如继承。