2010-11-13 82 views
6

我正在編寫一個功能,它將有助於獲取我的程序的某個包中的類。另外,我只想要繼承某個類的類。獲取包中聲明的所有Java類的名稱

我需要類來調用靜態方法。

有沒有一種自動的方式來做到這一點?如果是這樣,它慢嗎?

在情況下,我並不清楚,我想是這樣的:

ArrayList<Class<? extends MySuperClass>> classes = ; 

classes.add(MyClass.class); 
classes.add(MyClass2.class); 

而不必調用增加對每一類的,我想自動獲取類列表。

類的數量很少,所以我不介意手動聲明它們,如果自動技巧會很慢 - 這個應用程序是爲移動平臺。

在無論哪種方式,我也想知道如何調用靜態方法在ArrayList的每個方法:

// error The method nameOfStaticMethod is undefined for the type Class<capture#2-of ? extends MySuperClass> 
    classes.get(0).nameOfStaticMethod(); 

感謝您的意見。

回答

2

Java不提供此功能。在包級沒有反省。類可以是數據庫中的記錄,也可以是網絡連接的另一側。沒有要求對它們進行存儲和組織,以便於通過包列舉它們。

您可以使用自定義類加載器和API來提供列出類名稱的方法。

+0

能提供喲,爲什麼不包括這種能力的描述/將難以實現? – 2015-10-02 10:47:33

+0

這些類可能是數據庫中的記錄,也可能是網絡連接的另一端。沒有要求對它們進行存儲和組織,以便於通過包列舉它們。 – bmargulies 2015-10-02 10:49:14

+0

將您的評論打翻到答案中(「翻倒」是荷蘭語俚語,我認爲這也應該用在英語中,意思是:在許多「fr」「後以某種方式使它適合)。 – 2015-10-02 10:53:14

1

我太想列出一個包中的所有類,但到目前爲止,這樣做的方法是非常糟糕:

  • 像JOTN建議 - 需要的文件訪問 - 不,如果它是一個jar
  • 列出一個JAR條目 - 好,還需要jar文件

引用一個older SO問題:

不可能爲它的類(甚至它的子包)查詢Package。 http://forums.sun.com/thread.jspa?threadID=341935&start=0&tstart=0包含了一個關於爲什麼這是有問題的非常好的討論,以及針對您的問題的一些解決方案。

不管怎麼說,這裏是你如何調用這個類的靜態方法:

Method m = Integer.class.getMethod("toString", Integer.TYPE); 
System.out.println(m.invoke(null, 123)); 
+0

+1顯示如何調用靜態方法。 – MyNameIsZero 2010-11-13 21:48:37

+0

鏈接不幸中斷,並給出了一般的Oracle網站的狀態,很難追查。 – 2015-10-02 10:45:58

+0

這可能是斷開的鏈接:https://community.oracle.com/message/7520168#7520168 – tango24 2017-07-20 09:53:51