有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

早上好亲爱的董事会

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();

但现在我有一个例子,我需要做控制器的实例,并使用它们的方法,这在编码时是未知的。它们是通过运行时知道的,这取决于用户单击了哪个按钮

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

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) 个答案

  1. # 1 楼答案

    如果你真的想把反射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的继承的其他方法