Unsafe类能否获取一个独立对象的offset(这个对象不是某个其他对象的field)?

如题: Unsafe类能否获取一个独立对象的offset(这个对象不是某个其他对象的field)? 比如这个普通类User, 有一个对象:

@Data
public class User {
    private String name;
    private int age;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public static void main(String[] args) {
    // 1. 一个普通的独立User对象
    User u = new User("u1", 20);
    // 2. 获取Unsafe对象
    // 通过反射得到theUnsafe对应的Field对象
    Field field = Unsafe.class.getDeclaredField("theUnsafe");
    field.setAccessible(true); // 设置该Field为可访问
    Unsafe unsafe = (Unsafe) field.get(null); // 通过Field得到对应的对象,传入null是因为该Field为static

    // 3. ? 有没有什么方式获取到User的u对象的内存地址(offset)?
}
  1. 能否获取到u对象的内存地址?
  2. 或者, 有没有什么办法可以直接把u传入一个方法, 永久改变他的引用值?
阅读 2.1k
2 个回答

Unsafe应该不行,好像没有提供获取对象地址的api,可以用c/c++试试,不过不同虚拟机实现可能也有差别。

  1. 能否获取到u对象的内存地址?
static jlong JNICALL getObjectAddress(JNIEnv *env,jclass cla,jobject obj){
 return *(jlong *)obj;
}
  1. 或者, 有没有什么办法可以直接把u传入一个方法, 永久改变他的引用值

这应该是个伪需求,u = new User 就可以改变引用值了

这个问题来源于一个面试题: 就是通过调用一个方法: changeUser(u)
当 changeUser方法返回后, 能否就改变u的地址?
我们知道, 可以在方法内改变u的对象的内容; 但是能不能在里面通过Unsafe来改变u这个引用的指向呢?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏