java 如何拿地址
在Java中获取对象的内存地址可以通过以下几种方法实现:
使用System.identityHashCode()方法
System.identityHashCode(Object obj)方法返回给定对象的哈希码,该哈希码通常与对象的内存地址相关。虽然不能保证直接对应内存地址,但在大多数JVM实现中具有参考价值。
Object obj = new Object();
int hashCode = System.identityHashCode(obj);
System.out.println("HashCode (可能关联内存地址): " + hashCode);
使用Unsafe类(需谨慎)
通过sun.misc.Unsafe类可以获取更精确的内存地址信息,但该方法需要绕过Java的安全限制,且不同JVM版本可能不兼容。
import sun.misc.Unsafe;
import java.lang.reflect.Field;
public class AddressGetter {
private static Unsafe unsafe;
static {
try {
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (Unsafe) field.get(null);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static long getAddress(Object obj) {
Object[] array = new Object[]{obj};
long baseOffset = unsafe.arrayBaseOffset(Object[].class);
return unsafe.getLong(array, baseOffset);
}
}
注意事项
- Java设计初衷是屏蔽内存地址细节,以上方法均为非标准实现,可能随JVM版本变化失效。
identityHashCode()结果可能重复(哈希碰撞),且GC会导致对象地址变更。- 生产环境中应避免依赖内存地址,改用对象唯一标识符(如UUID)或其他业务键。
替代方案
若需唯一标识对象,推荐以下安全方式:

// 使用UUID
String uniqueId = UUID.randomUUID().toString();
// 或自定义唯一键
class Entity {
private final String id = generateId(); // 自定义生成逻辑
}






