ПустьJava: Как напечатать ссылку целочисленного объекта?
Integer integerA = 500;
Я хотел бы напечатать ссылку вернулся.
ПустьJava: Как напечатать ссылку целочисленного объекта?
Integer integerA = 500;
Я хотел бы напечатать ссылку вернулся.
Чтобы получить ссылку на объект как номер, вы можете использовать Unsafe на JVM, которые его поддерживают. Вы можете поместить ссылку в массив и получить доступ к ней с помощью Unsafe.getInt() для 32-битных ссылок (Примечание: большинство 64-разрядных JVM будут использовать 32-битные ссылки) или Unsafe.getLong() Это приведет к ссылке на ссылку как число, но оно может измениться, как только вы его получите, если происходит GC, и объект перемещается.
Еще одно осложнение состоит в том, что CompressedOops означает, что индекс объекта может быть переведен несколькими способами. Чтобы все было просто, я предлагаю использовать кучу от 4 ГБ до 26 ГБ. Для этих размеров вы меняете адрес на << 3
, чтобы получить адрес.
BTW Вы можете использовать Unsafe.putInt (x, 1, hashCode), чтобы перезаписать системный хэш-код. ;)
Я не верю, что может получить фактическое местоположение памяти объекта на Java (для печати или иным образом). Даже когда вы делаете System.out.println(new Object())
, то, что вы видите, не является «ссылкой», это строка, содержащая хэш-код объекта.
Видимо, вы можете видеть [ответ Питера Лори] (http://stackoverflow.com/questions/8820164/is-there-a-way-to-get-a-reference-address). –
@SteveP .: Вы не можете с * определенными * Java. Вы можете использовать ** в JVM Oracle **, используя недокументированные внутренние компоненты. Так что не на (как говорится в этом ответе) J9, JRockit, Dalvik и т. Д. –
Gotcha, пропустил это. –
Это печатает перегруженную версию метода toString в классе Integer. В общем случае, если класс не перегружал этот метод, он печатает имя класса + hashcode. Что-то вроде этого (вы должны сделать вручную):
integerA.getClass().getName() + "@" + integerA.hashCode()
Что печатает имя класса и hashcode, а не «ссылку». –
Реализация по умолчанию (если бы оно не было отменено) будет печатать объект как нечто вроде
Integer i = 95;
System.out.println(i.getClass().getName() + "@" + Integer.toHexString(i.hashCode()));
//[email protected]
В случае целого числа, то hashCode
Значение такое же, как базовое значение.
Метод toString
по-разному включает в себя метод hashCode
. Возможно, вы ищете это, поскольку это самое близкое, что я могу придумать, чтобы «распечатать ссылку».
Люди продолжают отвечать о hashCode()
, но hashCode()
для Integer
этого значения Integer
, оно не имеет ничего общего с его местоположением в памяти. Кроме того, в общем, только потому, что у двух Objects
есть те же hashCode()
, то не означает, что они ссылаются на те же Object
.
EDIT (в ответ на комментарий):
Даже если вы используете IdentityHashCode(), который дает не-перекрытую версию hashCode()
, вы все равно не получите адрес памяти.
@CodeEnthusiastic Я удалил его. –
Итак, как получить адрес памяти Integer? – JasonHuang
Ближайшим вы можете отобразить ссылку, это хеш-код, который будет вычисляться Object, System.IdentityHashCode(). Целое, конечно, переопределяет hashCode, поэтому собственный метод hashCode() Integer определенно не связан с его ссылкой.
На самом деле нет гарантии, что System.IdentityHashCode имеет какое-либо отношение к ссылке - это просто число, которое всегда одинаково при вычислении для одного и того же объекта и, по возможности, разные для разных объектов.
У меня есть сильное ощущение, что это случай [XY-Problem] (http://mywiki.wooledge.org/XyProblem). Зачем тебе это нужно? Что ты пытаешься сделать? –
Энтузиазм, см. Мое редактирование. –