Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何从堆中获取对象?_Java_Unsafe - Fatal编程技术网

Java:如何从堆中获取对象?

Java:如何从堆中获取对象?,java,unsafe,Java,Unsafe,这是一个场景: 我在类中实例化了一个字符串,然后获得了它在堆中的位置: public class UnsafeExperiment { static String s = "ciao"; public UnsafeExperiment() throws Exception { Unsafe unsafe = getUnsafeInstance(); Field field = this.getClass().getDeclaredField("

这是一个场景:

我在类中实例化了一个字符串,然后获得了它在堆中的位置:

public class UnsafeExperiment {

    static String s = "ciao";

    public UnsafeExperiment() throws Exception {
        Unsafe unsafe = getUnsafeInstance();
        Field field = this.getClass().getDeclaredField("s");
        field.setAccessible(true);

        long position = unsafe.staticFieldOffset(field);
        wait();

    }

    private  Unsafe getUnsafeInstance() throws Exception {
        Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
        theUnsafeInstance.setAccessible(true);
        return (Unsafe) theUnsafeInstance.get(Unsafe.class);
    }
}

从另一个类中,如何使用其地址调用堆中的字符串?(请注意,我不想考虑使用这种方法的机会。我从相关的库中知道它是不安全的)

您可以从其
位置访问字符串,如下所示:

String s = (String) unsafe.getObject(UnsafeExperiment.class, position);

为什么不直接传递对字符串的引用呢?为什么需要担心它在堆中的位置?为什么要这样做?托管语言(如Java)的要点是不必担心此类问题。对于反应式微服务系统的框架来说,这是一个非常复杂的场景中的用例:。长话短说:我有一个来自REST接口的DeferredResult,我需要在另一个应用程序中设置它的结果:不幸的是,我不能将DeferredResult作为引用传递,而是作为序列化对象传递:因此,如果我在另一个应用程序中修改它,则不会修改原始的DeferredResult。出于这个目的,我需要从第二个应用程序将堆中的原始地址发送回第一个应用程序上的观察者,其中延迟的结果是:当我有它时,我可以设置结果。所以这两个应用程序必须共享对对象的引用?你调查过RMI吗?您可以远程调用一个方法,该方法设置/获取应用程序之间共享的任何值。一个可以保存引用,另一个可以修改/访问ITA中的值以替换堆中的数据,我强烈建议不要尝试这样做。GCed语言在GCs之后压缩堆,这导致对象四处移动。据您所知,您可以引用堆的一部分,GC可能会导致压缩,使堆引用无效(或引用错误的数据)