2013-02-08 58 views
2
public class MyClass { 
    private String s = "foo"; 
} 

的初始化值是否有可能使用反射,而不必實例化一個新的MyClass得到"foo"使用反射來獲取一個字段

Field field = MyClass.class.getDeclaredField("s"); 
// -- ideally: -- 
// Object initializationValue = field.getInitializationValue(); 
// assert initializationValue.equals("foo"); 

回答

4

初始化語句就像你已經證明由編譯器實際上搬進類的構造函數。您需要實際實例化一個類才能執行它們。當然,這一切都在幕後。但是,在回答你的問題時,不,你不能,反正也不反思。

但你可能確定與靜態分析工具,如菸灰的字段值等

1

這也不是沒有可能「欺騙」。

一個作弊可能是編寫(或生成)一個類,創建一個新的MyClass實例,並使用反射挖掘出想要的值並將其寫入標準輸出。然後,您啓動一​​個子JVM來運行該類,然後在當前讀取它。

最終結果 - 您在當前JVM中獲得了該值,但未實例化MyClass

另一個騙子是使用一個字節碼庫來讀取MyClass的「.class」文件和的字節碼模擬在目前的JVM的背景下MyClass初始化的執行。