unsafe
C# では、コンテキスト内でポインターを使用できることを知っています。しかし、Java には同様のメモリアクセス方法がありますか?
Java には (正当な理由から) ポインターがありません。同様のメモリ アクセス方法があるとしたら、それは正確には何でしょうか?
unsafe
C# では、コンテキスト内でポインターを使用できることを知っています。しかし、Java には同様のメモリアクセス方法がありますか?
Java には (正当な理由から) ポインターがありません。同様のメモリ アクセス方法があるとしたら、それは正確には何でしょうか?
いいえ、できません。
最も近い方法は、JNI を使用して、特定のメモリ位置にあるデータを返す C 関数を呼び出すことです。
さて、sun.misc.Unsafe クラスがあります。ダイレクト メモリ アクセスが可能なため、キャストの再解釈などの魔法を実装できます。問題は、インスタンスを取得するためにハッキーなリフレクション アプローチを使用する必要があり、このクラスは十分に文書化されていないことです。一般に、この種のツールを本番コードで使用するには、十分な理由が必要です。
取得方法の例を次に示します。
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
105 のメソッドがあり、さまざまな低レベルのものを許可します。これらのメソッドは、ダイレクト メモリ アクセス専用です。
編集:このメソッドは、パブリック API の一部ではないため、OpenJDK またはその他の JVM 実装の将来のバージョンと互換性がない可能性があります。多くの OpenJDK コードは Unsafe を使用していますが、その実装は予告なく変更される可能性があります。コメントでこれを指摘してくれたすべての人に感謝します。
標準 Java は、ダイレクト メモリ バッファを使用して、アンマネージ メモリへのダイレクト メモリ アドレスを提供します。メソッドを使用して Java で、またはJNI 関数ByteBuffer.allocateDirect
を使用して C または C++ でダイレクト メモリ バッファーを割り当てることができます。NewDirectByteBuffer
任意のメモリ位置にアクセスすることはできませんが、直接メモリ バッファにアクセスするだけで、ほとんどの目的で十分です。特に、このNewDirectByteBuffer
関数では完全に任意のメモリ領域をByteBuffer
.
いいえ、Java には、任意のメモリ位置にアクセスするための言語内メカニズムがありません。JNI は、OS で許可されている (安全でなく、管理されていない) 操作は何でも実行できますが、それは可能な限り近いものです。