2017-06-21 39 views
1

如果你有一個列表類的名稱列表,如如何使用大量的基於類名的Java對象的數組

List<String> runnables = null; 
runnables.add("runnable1"); 
runnables.add("runnable2"); 
runnables.add("runnable3"); 

每個類實現Runnable

所以對於例如,這個工程

Thread t1 = new Thread(new runnable1()); 
t1.start(); 

但是,如果你想通過循環,並從陣列上運行所有這些,陣列在運行時動態生成的。即在編碼時你不知道哪些類名將在列表中,因爲它們可以改變。

runnables.forEach((String classname) -> { 
    System.out.println("The runnable is " + (String) classname); 
    Thread t1 = new Thread(new classname()); 
    t1.start();  
}); 

不行的,它說 「 找不到符號 符號:className類 位置:類ConncurrencyTesting 」 在啓動行「主題T1 = ......」在foreach 。

+0

對於記錄:*反射*是某種程度上的完整「主題「就其本身而言,如果你對此一無所知,我認爲你有可能使自己負擔過重。 – GhostCat

回答

3

如果該類之前試圖利用它加載,可以替換此行:

Thread t1 = new Thread(new classname()); 

這條線使用反射從類名生成實例:

Thread t1 = new Thread((Runnable)Class.forName(className).newInstance()); 

訣竅是,類必須全部實現Runnable,並且String類名也必須包含軟件包目錄。 (例如,而不是"Triangle"這將需要"shape.Triangle"

但是,如果你要使用一類是classpath之外,你將需要使用ClassLoader試圖實例之前加載類。我不建議這樣做,因爲它是一個更高層次的概念,如果你不熟悉Java處理類加載的方式會導致很大的頭痛。

相關問題