2010-05-24 48 views
3

我正在研究Java中的機器人模擬(Swing應用程序)。我有一個抽象類「機器人」,從中獲得不同類型的機器人。你可以看到,每個Robot子類都有一組不同的參數組。Java在運行時加載用戶指定的類

我想要做的是控制初始UI中的模擬設置。選擇機器人的數量和類型,給它一個名字,填寫參數等。

這是一個這樣的恐龍程序員和新來的Java,我不知道是否有更高層次的東西/認爲這可以幫助我。因此,這裏是我的本錢:

(1)用戶界面

左側機器人類型的滾動列表。 「添加>>」和「< <刪除」中間的按鈕。 默認命名的右側機器人滾動列表。 下方的「設置參數」按鈕。 (所以如果你想要一個AngryRobot,你會選擇左側列表中的AngryRobot,點擊「Add >>」,「AngryRobot1」將出現在右側)。

當在右側選擇一個機器人時, 「設置參數...」按鈕,它將調用另一個模型對話框,您可以在其中填寫參數。不同的對話框要求每個 機器人類型。

(2)數據結構的實現

作爲一個最終產品,我認爲一個HashMap將是最方便的。鍵是機器人類型,伴隨的對象將是所有參數。初始化器可以檢索每個項目,並且實例化。這裏的數據結構是什麼樣子:

enum ROBOT_TYPE {STUPID, ANGRY, etc} 

public class RobotInitializer { 
    public ROBOT_TYPE m_type; 
    public string m_name; 
    public int[] m_int_params; 
    public float[] m_float_params; 
    etc. 

的初始化的構造函數創建一個基於類型選擇合適的長度參數數組:

public RobotInitializer(ROBOT_TYPE type, int[] int_array, float[] float_array, etc){ 
    switch (type){ 
     case STUPID: 
      m_int_params = new int[STUPID_INT_PARAM_LENGTH]; 
      System.arraycopy(int_array,0,m_int_params,0,STUPID_INT_PARAM_LENGTH); 

     etc. 

一旦所有的RobotInitializers被實例化,它們將被添加到HashMap中。

迭代通過HashMap,模擬初始化程序從Hashmap中獲取項目並實例化合適的Robots。

這是合理的嗎?如果不是,如何改進?

謝謝

回答

1

如上所述,您可以使機器人成爲RobotInterface的一個實現。然後:

Class aRobotClass = Class.forName("robotClassName"); //or similar 
Class[] aRobotClassImplements = aRobotClass.getIterfaces(); 
// Then ensure that "RobotInterface" exists in the aRobotClassImplements array. 

RobotInterface應該爲Robot屬性定義getter和setter。

我假設eash機器人可以有一系列不同的屬性。可以動態檢查Robot實例並創建適當的按鈕/控制器。例如:

Field[] robotFields = aRobotClass.getFields(); 

for (Field field : robotFields) { 
    JButton jbutton = new JButton(field.getName()); 
    //assuming this class implements ActionListener 
    jbutton.addActionListener(this); 
    // Then assume we have a private class representing a button) 
    this.hashMapOrVectorOfButtons.add(new PrivateButton(field)); 
    jpanel.add(jbutton); 
    // etc etc 
} 

後來在actionPerformed中,遍歷散列表或註冊按鈕的向量。 (field.getName()。等於(actionEvent.getActionCommand()))。然後在你的Robot實例中操作適當的字段。

3

您可以使用反射來在運行時動態加載類型。請參閱Class.forName以瞭解如何獲得Class,因爲它是完全限定名稱。然後,您可以使用isAssignableFrom方法來檢查該類是Robot的子類。您可以在Robot中定義一些模板方法,讓子類指定具體行爲(例如應初始化哪些屬性)。一旦獲得了類定義,就可以使用newInstance()方法來創建Robot實例(該類必須具有默認構造函數,否則您應該使用getConstructors()方法並使用您需要的方法)。

我知道還有另外一種方法來給定類文件的完整路徑,但不記得現在如何。

1

您也可以使用RMIClassLoader,儘管如果您可以這樣使用,我會推薦Fede的迴應。