2013-03-01 70 views
3

public static void main(String args[])args[]內,我想指定要實現哪個子類。如何將args[](a String)的參數轉換爲類聲明?Java:將Subclass Type作爲Main的參數

例如,如果args[0] = "Subclass1",然後在下面的地方我需要聲明:
BaseClass b = new Subclass1()

這可能與Java?

編輯
爲了使這一步麻煩,這些子類從外部.jar到來。有什麼辦法可以動態地導入子類,還是需要事先導入它們?

+0

你可以添加更多的細節,你有什麼嘗試? – Aubin 2013-03-01 15:59:40

+0

我知道你可以通過命令行填充args數組,不知道如何填充它在其他地方 – 2013-03-01 15:59:51

+0

@JeffHawthorne - 從命令行填充參數 – 2013-03-01 22:58:23

回答

6
public static void main(String[] args) { 
    if (args.length > 0) { 
     // exceptions handling omitted 
     Class<?> clazz = Class.forName(args[0]); 
     // check before casting 
     if (BaseClass.class.isAssignableFrom(clazz)) { 
      BaseClass instance = (BaseClass) clazz.newInstance(); 
      // use 
     } 
    } 
} 

注意className應該是完整路徑到類,即不僅Subclass1,而且your.package.Subclass1

+0

謝謝!這正是我需要的。 – 2013-03-01 16:08:27

+0

對此的疑問:這隻能創建一個「對象」,對嗎?把它放在同一條線上是好的,還是應該單獨做? – 2013-03-01 16:18:48

+0

@Adam_G查看我的編輯以安全地轉換實例化對象。 – sp00m 2013-03-01 16:24:23

8

類的名稱應該是完整路徑類,即[包裝] [類名] 可以使用Class.forName([class name]).newInstance();

+0

謝謝!這是我正在尋找的,但是我會用@ sp00m去,因爲更明確的聲明。 – 2013-03-01 16:08:06

2

如果你的主類被稱爲com.acme.app.Main,它具有的public static class Subclass1一個子類,然後用這個代碼片段:

Class<?> cls = Class.forName("com.acme.app.Main$"+args[0]); 
Object instance = cls.getConstructor().newInstance(); 

內部類是通過$標誌訪問。

請注意,cls.getConstructor().newInstance()比舊的cls.newInstance()更受推薦。

如果您知道您的內部類實現或擴展了某個界面或類,則可以使用Class<MyInterface>MyInterface instance而不是一般對象。

+0

爲什麼'cls.getConstructor()。newInstance()'推薦通過'cls.newInstance()'? – 2013-03-01 16:12:40

+1

因爲第一個可以捕獲'IllegalArgumentException'和'InvocationTargetException',例如如果你想傳遞參數。 – gaborsch 2013-03-01 16:17:25

+0

明白了!謝謝! – 2013-03-01 19:52:35

相關問題