2013-08-03 3 views
3

ПустьJava: Как напечатать ссылку целочисленного объекта?

Integer integerA = 500; 

Я хотел бы напечатать ссылку вернулся.

+6

У меня есть сильное ощущение, что это случай [XY-Problem] (http://mywiki.wooledge.org/XyProblem). Зачем тебе это нужно? Что ты пытаешься сделать? –

+0

Энтузиазм, см. Мое редактирование. –

ответ

3

Чтобы получить ссылку на объект как номер, вы можете использовать Unsafe на JVM, которые его поддерживают. Вы можете поместить ссылку в массив и получить доступ к ней с помощью Unsafe.getInt() для 32-битных ссылок (Примечание: большинство 64-разрядных JVM будут использовать 32-битные ссылки) или Unsafe.getLong() Это приведет к ссылке на ссылку как число, но оно может измениться, как только вы его получите, если происходит GC, и объект перемещается.

Еще одно осложнение состоит в том, что CompressedOops означает, что индекс объекта может быть переведен несколькими способами. Чтобы все было просто, я предлагаю использовать кучу от 4 ГБ до 26 ГБ. Для этих размеров вы меняете адрес на << 3, чтобы получить адрес.

BTW Вы можете использовать Unsafe.putInt (x, 1, hashCode), чтобы перезаписать системный хэш-код. ;)

1

Я не верю, что может получить фактическое местоположение памяти объекта на Java (для печати или иным образом). Даже когда вы делаете System.out.println(new Object()), то, что вы видите, не является «ссылкой», это строка, содержащая хэш-код объекта.

+0

Видимо, вы можете видеть [ответ Питера Лори] (http://stackoverflow.com/questions/8820164/is-there-a-way-to-get-a-reference-address). –

+0

@SteveP .: Вы не можете с * определенными * Java. Вы можете использовать ** в JVM Oracle **, используя недокументированные внутренние компоненты. Так что не на (как говорится в этом ответе) J9, JRockit, Dalvik и т. Д. –

+0

Gotcha, пропустил это. –

1

Это печатает перегруженную версию метода toString в классе Integer. В общем случае, если класс не перегружал этот метод, он печатает имя класса + hashcode. Что-то вроде этого (вы должны сделать вручную):

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

Что печатает имя класса и hashcode, а не «ссылку». –

-1

Реализация по умолчанию (если бы оно не было отменено) будет печатать объект как нечто вроде

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

В случае целого числа, то hashCode Значение такое же, как базовое значение.

0

Метод toString по-разному включает в себя метод hashCode. Возможно, вы ищете это, поскольку это самое близкое, что я могу придумать, чтобы «распечатать ссылку».

2

Люди продолжают отвечать о hashCode(), но hashCode() для Integer этого значения Integer, оно не имеет ничего общего с его местоположением в памяти. Кроме того, в общем, только потому, что у двух Objects есть те же hashCode(), то не означает, что они ссылаются на те же Object.

EDIT (в ответ на комментарий):
Даже если вы используете IdentityHashCode(), который дает не-перекрытую версию hashCode(), вы все равно не получите адрес памяти.

+0

@CodeEnthusiastic Я удалил его. –

+1

Итак, как получить адрес памяти Integer? – JasonHuang

3

Ближайшим вы можете отобразить ссылку, это хеш-код, который будет вычисляться Object, System.IdentityHashCode(). Целое, конечно, переопределяет hashCode, поэтому собственный метод hashCode() Integer определенно не связан с его ссылкой.

На самом деле нет гарантии, что System.IdentityHashCode имеет какое-либо отношение к ссылке - это просто число, которое всегда одинаково при вычислении для одного и того же объекта и, по возможности, разные для разных объектов.

Смежные вопросы