2014-10-16 46 views
2

假設我在my.package包中包含一個類Foo,其中包含一些靜態字段。使用反射實現此類的正確方法

我想使用反射來獲取這些靜態字段的值。

我知道我可以寫my.package.Foo.class.getDeclaredField(...,但這是不令人滿意的,因爲我對類名和包名進行了硬編碼。

我想使用this.class.getDeclaredField(...,但即使從非靜態成員函數內調用,這在Java中也是無效的。

有沒有辦法?

+0

非靜態,你可以使用'this.getClass()'。 – Pokechu22 2014-10-16 15:29:41

回答

3

每個類都繼承實例方法Object#getClass()。調用以獲取您的實例對應的Class對象。

我不知道爲什麼這裏面Foo作爲Foo已經知道其static領域,你會直接在編譯時對它們的訪問,你會怎麼做。

0

非靜態地,您可以使用this.getClass()來獲取當前班級,如@sotirios-delimanolis所述。

靜態,你可以做到這一點,雖然這是一個有點難看:

public static Class<?> getCurrentClassStatic() { 
    try { 
     return Class.forName(new Throwable().getStackTrace()[0].getClassName()); 
    } catch (ClassNotFoundException e) { 
     return null; //Shouldn't happen... 
    } 
}