2015-03-31 57 views
0

早上好,親愛板創建匿名控制器的實例,並使用它的方法

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

我懷疑,我是第一個嘗試這樣的事情 - 所以你們是我的最後一次機會。

感謝和問候 埃尼斯

+2

我不明白你爲什麼這樣做。您可以在控制器中放置一個'fx:controller'屬性,FXML加載器將自動爲FXML創建控制器,並在控制器上調用'initialize'方法。因此,您可以動態加載您的FXML,並且JavaFX系統爲您處理所有其他事情 - 您無需將控制器設置爲Java代碼中的加載器,也不需要使用反射來調用方法。 – jewelsea 2015-03-31 09:51:07

+0

「不起作用」是什麼意思?是否有一些錯誤跟蹤或什麼? – jewelsea 2015-03-31 09:54:51

回答

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繼承。

+0

感謝您的回覆!我會檢查你的解決方案,直到明天。 是的,我還記得繼承。在我看來,反思不應該比其他面向對象更慢。我會在最後爲這兩種解決方案進行性能檢查!感謝Uluk! – 2015-03-31 11:43:05

相關問題