2014-04-04 87 views
0

我在java中實現了一個名爲「ExerciseMovement」的抽象類,它實現了Runnable,並且具有擴展實現run()方法的抽象類的具體類。在我的客戶端代碼中,我試圖創建一個代碼來創建擴展抽象類並啓動其線程的所有類的對象。我不確定在沒有真正知道什麼類擴展抽象類的情況下我能做到這一點。可能嗎?創建在java中擴展抽象類的所有類的對象

+0

也許類似[this](http://stackoverflow.com/questions/205573/at-runtime-find-all-classes-in-a-java-application-that-extend-a-base-class)可以幫你? – Stefan

+0

這[很簡單](http://code.google.com/p/reflections/)。雖然我會建議你使用線程池而不是原始的'Thread'。 –

回答

0

我不認爲Java有這樣的機制。你可以做的是在ExerciseMovementRegister上註冊每個實現的類,它可以給你一個類的列表。這需要在靜態塊中完成(這是不理想的)。爲他們創造的對象是微不足道的,然後(僞代碼,而不是編譯!):

List<Class<? extends ExerciseMovement>> exerciseClasses = ExerciseMovementRegister.getClasses(); 

for(Class klass: exerciseClasses) { 
    ExerciseMovement move = (ExerciseMovement) klass.newInstance(); 
    move.start(); 
} 
+4

這不是一個'List >'? –

+0

正確,我會更新,謝謝! – Martin

+0

你也有一個原型在'for(Class'。 –

-1

你不能得到延伸與標準反射超類的所有類。但是你可以在面向對象的方法解決這個問題:

public abstract class ExerciseMovement 
{ 
@SuppressWarnings("rawtypes") 
private static ArrayList<Class> inheritedClasses = new ArrayList<Class>(); 

public ExerciseMovement() 
{ 
    inheritedClasses.add(this.getClass()); 
} 

@SuppressWarnings("rawtypes") 
public Object[] createInheritedObjects() 
{ 
    ArrayList<Object> result = new ArrayList<Object>(); 

    if(inheritedClasses.size() > 1) 
    { 
     for(int i = 0; i < inheritedClasses.size(); i++) 
     { 
      Class c = inheritedClasses.get(i); 
      try 
      { 
       result.add(c.newInstance()); 
      } 
      catch (InstantiationException e) 
      { 
       e.printStackTrace(); 
      } 
      catch (IllegalAccessException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 

    return result.toArray(); 
} 

}

這絕對不是一個很好的解決方案,但它是唯一一個可能與本地Java

+0

你必須'@SuppressWarnings(「rawtypes」)''顯示你正在做某件你不該做的事情。**從不**使用rawtypes。 –

+0

你可以改用?extend ExerciseMovement – Shadow3097

1

知道所有的子類是不直接可能在Java中。

這個問題有兩種臨時解決方案。

  1. 掃描整個類路徑:
    爲了這個目的,你可以使用Reflections library

    Reflections reflections = new Reflections("my.package.prefix"); 
    
    Set<Class<? extends ExerciseMovement>> subclasses = reflections 
            .getSubTypesOf(my.package.prefix.ExerciseMovement.class); 
    

    你會在2行中得到你想要的。
    現在創建對象和啓動線程很容易。

  2. 讓每個類向基類(ExerciseMovement)註冊自己(在靜態塊中)並維護所有子類的列表。

    雖然很容易做到,但它不適用於所有的子類。只有小類其中已經已被加載類加載器將提供給你。

希望這會有所幫助。