我在java中實現了一個名爲「ExerciseMovement」的抽象類,它實現了Runnable,並且具有擴展實現run()方法的抽象類的具體類。在我的客戶端代碼中,我試圖創建一個代碼來創建擴展抽象類並啓動其線程的所有類的對象。我不確定在沒有真正知道什麼類擴展抽象類的情況下我能做到這一點。可能嗎?創建在java中擴展抽象類的所有類的對象
回答
我不認爲Java有這樣的機制。你可以做的是在ExerciseMovementRegister上註冊每個實現的類,它可以給你一個類的列表。這需要在靜態塊中完成(這是不理想的)。爲他們創造的對象是微不足道的,然後(僞代碼,而不是編譯!):
List<Class<? extends ExerciseMovement>> exerciseClasses = ExerciseMovementRegister.getClasses();
for(Class klass: exerciseClasses) {
ExerciseMovement move = (ExerciseMovement) klass.newInstance();
move.start();
}
你不能得到延伸與標準反射超類的所有類。但是你可以在面向對象的方法解決這個問題:
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
你必須'@SuppressWarnings(「rawtypes」)''顯示你正在做某件你不該做的事情。**從不**使用rawtypes。 –
你可以改用?extend ExerciseMovement – Shadow3097
知道所有的子類是不直接可能在Java中。
這個問題有兩種臨時解決方案。
掃描整個類路徑:
爲了這個目的,你可以使用Reflections library。Reflections reflections = new Reflections("my.package.prefix"); Set<Class<? extends ExerciseMovement>> subclasses = reflections .getSubTypesOf(my.package.prefix.ExerciseMovement.class);
你會在2行中得到你想要的。
現在創建對象和啓動線程很容易。讓每個類向基類(
ExerciseMovement
)註冊自己(在靜態塊中)並維護所有子類的列表。雖然很容易做到,但它不適用於所有的子類。只有小類其中已經已被加載類加載器將提供給你。
希望這會有所幫助。
- 1. Java的抽象類擴展兩個類
- 2. 用Java中的抽象類擴展ArrayList?
- 3. 在Java中創建抽象類中的新對象
- 4. 抽象對象或創建類對象
- 5. 抽象類在PHP中擴展抽象類?
- 6. 如何從抽象類中創建擴展類?
- 7. 如何創建子類對象的java抽象類列表
- 8. 創建抽象類的對象 - 錯誤
- 9. Java:擴展對象類
- 10. 抽象類擴展的具體類
- 11. 在我上有一個抽象類的現有庫擴展一個抽象類
- 12. 擴展抽象泛型類
- 13. 抽象基類擴展
- 14. 抽象類擴展Thread
- 15. 在PHP中,從基類實例創建擴展類的對象
- 16. 擴展另一個抽象類的php抽象類
- 17. 在Typescript中擴展抽象類
- 18. 在c中擴展抽象類#
- 19. 如果無法創建抽象類的新對象,抽象類中的非抽象方法有什麼意義?
- 20. 一個對象可以在scala中擴展抽象類嗎?
- 21. 創建抽象類
- 22. 創建抽象類
- 23. 爲抽象類創建對象
- 24. 如何動態創建一個在PHP中擴展抽象類的匿名類?
- 25. C# - 抽象類擴展類和new()?
- 26. C++,在抽象類中創建匿名子類對象
- 27. 擴展Java類的Scala對象
- 28. JAVA - 創建抽象類的對象取決於參數
- 29. 按鈕點擊擴展抽象類操作的Java類
- 30. 抽象類擴展了多種類型的活動Java和Android
也許類似[this](http://stackoverflow.com/questions/205573/at-runtime-find-all-classes-in-a-java-application-that-extend-a-base-class)可以幫你? – Stefan
這[很簡單](http://code.google.com/p/reflections/)。雖然我會建議你使用線程池而不是原始的'Thread'。 –