C / C ++では、次のことができます。
struct DataStructure
{
char member1;
char member2;
};
DataStructure ds;
char bytes[] = {0xFF, 0xFE};
memcpy(&ds, bytes, sizeof(ds));
そして、あなたは本質的に次のものを得るでしょう:
ds.member1 = 0xFF;
ds.member2 = 0xFE;
Javaに相当するものは何ですか?
Javaに相当するものは何ですか?
Java に相当するものはありません。
Java では、そのレベルでアクセスしてオブジェクトを作成または変更することはできません。new達成しようとしていることに応じて、メソッドまたはセッター メソッドを使用する必要があります。
(この種のことを行うにはいくつかの方法がありますが、それらは安全ではなく、移植性がなく、「Java ではない」...そして、この状況では保証されません。)
あなたはCでそれを行うことができるかもしれません。しかし、あなたはエイリアシングの問題と未定義の振る舞いを燃やすhunkahunkaに迷い込んでいるでしょう。
また、構造体のパディングはコンパイラー次第であるため、memcpyで取得できるのは、ds.member1 = 0xFF、ds.member2 =メンバー1が4バイトを占めるようにパディングされているため、その時点でスタックにあったジャンクです。または、4バイトの上位2バイトを設定し、下位2バイトにあるため、両方がジャンクになる可能性があります。
あなたがさまよっているのは、コンパイラ/ランタイム固有のメモリレイアウトです。同じことがJavaにも当てはまります。Java自体では、Java以外の恐ろしいことはできませんが、独自のJVMを作成したり、CまたはC ++で作成された既存のJVMをデバッグしたりすると、そのようなことができます。そして、誰が何が起こるかを知っています。私は、JVM仕様がJVM実装をどれだけピン留めするかを正確に知るのに十分なJavaの神ではありませんが、オブジェクトのメモリ内のランタイム表現の相互運用性を有効にするために必要な程度ではないと思います。
したがって、すべての言語フレーバーで未定義の動作が発生します。ミステリーミートのように、各言語でも同じようにおいしいです。
あなたmemcpyが書いたは、構造体の内部実装に依存しており、必ずしも機能するとは限りません。Java では、バイト配列を受け入れてフィールドを設定するコンストラクターを定義する必要があります。クラスのメモリ構造が定義されていないため、このようなショートカットはありません。
Javaでは、メモリを直接操作することはできません(いいえmemcpy)Javaの利点(欠点?)です。配列をコピーする Java ライブラリ メソッドがいくつかあります: System.arraycopy()。一般に、オブジェクトをコピーするには、 cloneメソッドを使用して出荷する必要があります。