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

Java 创建匿名控制器的实例并使用其方法,java,reflection,javafx,Java,Reflection,Javafx,早上好,亲爱的董事会 Java中有一种方法可以生成匿名类的实例: Class<?> c = Class.forName("class name"); Method method = c.getDeclaredMethod ("method name", parameterTypes) method.invoke (objectToInvokeOn, params) 但现在我有一个例子,我需要做控制器的实例,并使用它们的方法,这些方法在编码时是未知的。它们是通过运行时知道的,这取决

早上好,亲爱的董事会

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

Class<?> c = Class.forName("class name");
Method  method = c.getDeclaredMethod ("method name", parameterTypes)
method.invoke (objectToInvokeOn, params)
但现在我有一个例子,我需要做控制器的实例,并使用它们的方法,这些方法在编码时是未知的。它们是通过运行时知道的,这取决于用户单击了哪个按钮

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

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);
我怀疑,我是第一个尝试这样的事情-所以你们是我最后的机会

谢谢并致以最良好的问候
Enis

如果您真的想将反射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之类的继承来实现其他方法。

我不明白您为什么要这样做。您可以在控制器中放置fx:controller属性,FXML加载程序将自动为FXML创建控制器,并在控制器上调用initialize方法。因此,您可以动态加载FXML,JavaFX系统将为您处理所有其他事情—您不需要在Java代码中将控制器设置为加载程序,也不需要使用反射来调用方法。什么是不起作用的?是否有一些错误跟踪或什么的?谢谢你的回复!明天之前我会检查你的解决方案。是的,我也考虑过继承权。在我看来,反射不应该像其他OOP那样慢。最后,我将对这两种解决方案进行性能检查!谢谢你,乌鲁克!
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);