2

オブジェクトの文字列値を取得して、その特定の文字列を介して同じマシン (同じ RAM) または同じ VM 上のそのオブジェクトにアクセスできるかどうか疑問に思っていました。

例えば

Object objA1 = new Object();
System.out.print(objA1.adress); => output: d146a6581ed9e
Object objExt = Object.buildFromMemoryAdress("d146a6581ed9e");

私が理解しようとしていることを理解していただければ幸いです。

編集:私はで見つけました

http://javapapers.com/core-java/address-of-a-java-object/#&slider1=1

(VM?) メモリ上のインスタンスの論理アドレスの文字列を取得できるクラス:sun.misc.Unsafe

Unsafe を使用して (VM に制限されている?) メモリからオブジェクトを取得することもできると思います。

このように不可能な場合、どうすればいいですか?好奇心から、このような直接メモリアクセスを許可する他の言語(特にハイエンド)はありますか?

4

3 に答える 3

5

toString()結果に表示される数値がメモリ アドレスであると想定するのは正しくありません。

実際、これはオブジェクトのハッシュ コードです。オブジェクトが変更されていない場合、そのハッシュ コードは一定のままです。ただし、メモリ アドレスはいつでも変更される可能性があります。圧縮ガベージ コレクタは、必要に応じてオブジェクトをメモリ内で移動することを決定できます。

于 2012-01-18T08:31:57.350 に答える
3

絶対違う。toString()実際、メソッドが同じ文字列を返す2 つの異なるオブジェクトを持つことができることを考えると、明らかに不可能です。簡単な例として:

Integer a = new Integer(10);
Integer b = new Integer(10);

Object x = Object.buildFromToString("10");

何をx参照する必要がありますか?参照する同じaオブジェクト、または参照する同じオブジェクトb?

toString()オブジェクト識別子を返すことを意図したものではなく、オブジェクトのある種のテキスト表現を返すことを意図したものです。デフォルトの実装が識別子に少し似たものを返すという理由だけで、それを識別子として使用する必要があることを示していると見なすべきではありません。

別の時点でオブジェクトにアクセスする方法を保存したい場合は、オブジェクトへの参照をObject変数として保存することをお勧めします。

于 2012-01-18T08:30:07.510 に答える
2

いいえ、これは不可能です。Java オブジェクトは、それらのオブジェクトへの参照がある場合にのみアクセスできます。できることは、オブジェクトをMap<String, Object>特定の名前で保存し、マップを使用してその名前からオブジェクトの参照を取得することです。

于 2012-01-18T08:31:32.180 に答える