2015-09-01 33 views
0

我曾嘗試T.SIZE/8對於這個問題,但給我一個錯誤。如何在JAVA中查找通用數據類型大小?

,我也試過Integer.Size這給了我一個正確的解決方案4 bytes

所以我怎麼能找到在JAVA通用數據類型牛逼的大小?

我的程序:

class A<T> { 
    T a; 
    T b; 
    A(T a, T b) { 
    this.a = a; 
    this.b = b; 
    } 
    void s() { 
    System.out.print("size in byte is "+(T.SIZE/8)+"bytes"); 
    } 
} 

class Demo { 
    static public void main(String a[]) { 
    A<Integer> ob = new A<Integer>(10, 20); 
    ob.s(); 
    } 
} 
+0

你不能因爲類型擦除沒有。 – meskobalazs

+0

這與類型擦除無關,在Java中,它必須是動態的,因爲編譯器不知道! – loonytune

回答

1

答案很簡單:你不能。 由虛擬機決定字段的排列順序,因此大小取決於虛擬機的實現和配置。但是,您可以使用Java虛擬機工具接口(JVMTI)附加本地代理來查詢對象的大小。但是,如果您真的需要,這可能在您的案例中有點過分強大,並且值得另一個問題。

一個骯髒的黑客:你也可以「猜」的基礎上的內部知識是什麼虛擬機通常不會。每個4字節或更少的數據類型總是佔用4個字節,每個其他數據類型(雙倍,長度)佔用8個字節,指針佔用4或8個字節,具體取決於您的架構。對象頭佔用16個字節。使用反射,你可以查找你的領域,並數你自己。然而,有很多東西可能會讓你的手動計算變得糟糕,例如,壓縮的oops可能會使64位機器上的指針只有32位,...

所以,長話短說:除非你想建立一個代理!

編輯:我想補充:Integer.Size給你一個「INT」的大小,而不是一個「整數」對象的大小!

相關問題