2013-08-03 62 views
3

假設Java:如何打印Integer對象的引用?

Integer integerA = 500; 

我想打印的引用返回。

+6

我有一種強烈的感覺,這是[XY-Problem](http://mywiki.wooledge.org/XyProblem)的一種情況。你爲什麼需要這個?你想做什麼? –

+0

熱情,查看我的編輯。 –

回答

3

爲了讓參考對象作爲一個數字,你可以在支持它的JVM使用不安全。你可以將參考在陣列中並用Unsafe.getInt()爲32位的引用(注意:大多數64位JVM將使用32位的參考文獻)訪問它或Unsafe.getLong()這將訪問作爲參考一個數字,但是如果GC發生並且對象被移動,只要你得到它就可以改變它。

另一個複雜之處在於CompressedOops意味着索引的對象可以被翻譯許多不同的方式。爲了簡單起見,我建議使用4GB到26GB的堆。對於這些尺寸,您將地址移動<< 3以獲取地址。

BTW您可以使用Unsafe.putInt(x,1,hashCode)來覆蓋系統hashCode。 ;)

1

我不相信你可以獲取Java中某個對象的實際內存位置(用於打印目的或其他方式)。即使你做System.out.println(new Object()),你看到的不是的「引用」位置,它是一個包含對象散列碼的字符串。

+0

顯然你可以看到[Peter Lawrey的回覆](http://stackoverflow.com/questions/8820164/is-there-a-way-to-get-a-reference-address)。 –

+0

@SteveP .:你不能使用* defined * Java。您可以在Oracle的JVM **上**使用無證內部。所以不是(作爲對該答案的評論提及)J9,JRockit,Dalvik等 –

+0

嘿,錯過了。 –

1

這會在Integer類中輸出「toString」方法的重載版本。 一般來說,如果一個類沒有重載該方法,它將輸出classname + hashcode。像這樣的東西(你必須手動完成):

integerA.getClass().getName() + "@" + integerA.hashCode() 
+2

它打印類名和散列碼,而不是「引用」。 –

-1

默認實現(如果不是被覆蓋)將打印的物體,就像這樣

Integer i = 95; 
System.out.println(i.getClass().getName() + "@" + Integer.toHexString(i.hashCode())); 
//[email protected] 

萬一整數時, hashCode的價值與底層價值相同。

0

各種類別的默認toString方法涉及hashCode方法的結果。也許你正在尋找那個,因爲它是我能想到的「打印參考」最接近的。

2

人們一直在回答約hashCode(),但hashCode()IntegerInteger的值,它與它在內存中的位置無關。另外,一般而言,僅僅因爲兩個Objects具有相同的hashCode()而不是而不是意味着它們引用相同的Object

EDIT(在響應評論)
即使你使用IdentityHashCode(),它給出了hashCode()非overrided版本,你仍然不會得到一個內存地址。

+0

@CodeEnthusiastic我刪除它。 –

+1

那麼,如何獲得Integer的內存地址? – JasonHuang

3

你可以得到顯示參考最接近的是,因爲它會通過對象來計算哈希碼,System.IdentityHashCode()。 Integer當然會覆蓋hashCode,所以Integer自己的hashCode()方法肯定與其引用無關。

事實上,並不保證System.IdentityHashCode與引用有任何關係 - 它只是一個數字,當爲同一個對象計算時總是相同的,也就是說,儘可能地,對於不同的對象不同。