2013-07-29 54 views
5

我想獲取一個課程的進口列表。由於這被編譯器刪除了,我想通過反射可以掃描類,它是方法,字段等,並且收集類加載類所需的類的列表。是否有某種圖書館,教程或文章可以指向我,這樣我可以更好地理解如何做到這一點? (我瞭解類似的問題已經被問到,但我找不到正確的答案,我很確定這應該是可能的)。我看到了一些例子,說明如果你有來源,你如何做到這一點,但在我的情況下並不一定如此。獲取要加載的課程的必要課程列表

非常感謝提前!

+0

可能的重複[如何獲得所有使用java反射在類中定義的導入?](http://stackoverflow.com/questions/5701305/how-to-get-all-imports-defined-in-a- class-using-java-reflection) – Gamb

+0

@Gamb:這不是重複的!我已經看過,我知道你不能得到確切的進口清單。然而,從理論上講,你應該能夠使用反射來收集你的課程使用的所有類的列表。我正在尋找這樣一個圖書館。 – carlspring

+1

您需要查看原始字節碼。你的課堂可能需要一門需要另一門課程的課程。你必須一直這樣做直到你缺課。注意:這可能比你需要的多,因爲一個類可能不需要僅僅因爲它引用了另一個類。另外一個類可能需要通過反射另一個類。 –

回答

7

不,反射將不利於

void test() { 
    Date date = new Date(); 
} 

您不能檢測日期是內部方法與反思中。但是你可以

+0

有!那有多複雜! :) 非常感謝! – carlspring

+1

如果一個給定的類不在類路徑上,這也能起作用嗎? – carlspring

+2

Theres cp。makeClass(InputStream classFile) –

1

我不認爲這是可能的遠程除了通過閱讀源使用了Javassist https://github.com/jboss-javassist/javassist

ClassPool cp = ClassPool.getDefault(); 
    Collection classes = cp.get("test.Test").getRefClasses(); 

這段代碼產生的test.Test類引用的所有類的名稱的集合。 java文件本身。我相當確信Java只是在編譯期間使用列表進行掃描,然後將其拋棄。但是,Spring有這樣的東西,並且有一個google項目,可以掃描包註釋和類似的東西(忘記名稱 - classpath?)。

我建議你看看春天,它可能正是你想要的,更多,並以下一個程序員會自動理解(如果他們知道春天)的方式。

+0

IoC並不是我正在尋找的東西,但你確實是對的,春天似乎正在做一些類似的魔術。 – carlspring

+0

Spring不僅僅是IoC,它使得面向方面的Java更易於訪問。它可以掃描和實例化軟件包,並允許您在調用方法之前和之後執行操作等。 –