0

Java は、実際に変数またはオブジェクトのアドレスを提供できるポインターの概念をサポートしていないことを知っています。しかし、この場合、あなたは何を言いますか

A a1 = new A();    
System.out.println(a1);

ここで a1 は、クラス A のオブジェクトを指す 1 つの参照変数です。しかし、a1 を出力すると、オブジェクトのアドレスが出力されます。

だから、Javaでオブジェクトのアドレス(あまりにも完全に修飾されたアドレス)をいつ取得できるかを尋ねるつもりですが、どうすれば安全でしょうか?

誰かがJavaに関する私の概念を明確にすることができますか? 前もって感謝します。

4

6 に答える 6

4

によって印刷された番号Object.toString()は住所ではありません。これはアイデンティティのハッシュコードです。この番号は住所から派生している可能性がありますが、その方法は不明です。

それがアドレスだったとしても、任意のアドレスにアクセスできないため、何もできません。

クラスのインスタンスを作成することがセキュリティに関連するかどうかは、あなた次第です。その場合は、許可されたエンティティのみがそのようなインスタンスを作成できるようにするための措置を講じる必要があります

于 2013-10-22T11:03:16.140 に答える
3

実際に出力されるのは、アドレスではなく「ID ハッシュ コード」です (こちらを参照)。また、アドレスであっても、安全でないポインター参照を実行するために使用できない読み取り専用の情報になります。

于 2013-10-22T11:03:04.007 に答える
1

しかし、a1を印刷すると、オブジェクトのアドレスが印刷されます。

いいえ、オブジェクトのアドレスは出力されません。オブジェクトを印刷しようとすると、そのtoStringメソッドが呼び出され、デフォルトのtoStringメソッド出力には、クラス名と、 @` で区切られたオブジェクトのハッシュ コードの符号なし 16 進数表現が含まれます。シンボル

だから、Javaでオブジェクトのアドレス(あまりにも完全に修飾されたアドレス)をいつ取得できるかを尋ねるつもりですが、どうすれば安全でしょうか?

オブジェクトのメモリアドレスを取得することはなく、それを操作することもできません。

于 2013-10-22T11:04:04.740 に答える
1

sun.misc.Unsafeを使用していない限り、Java は安全です。何println(a1)を印刷するかは指定されていません。住所である必要はありません。それが住所だったとしても、それを使って読み書きする合法的な方法はありません。

于 2013-10-22T11:06:50.657 に答える
0

最初の質問ですが、これを読んで、違いを理解する脳に負担をかけるようお願いしたいと思います。

2つ目は、あなたがプログラマーであることを考えると、あなたが話しているオブジェクト生成のメソッドを作成しないことで、クラスのものをプライベートに保つという制限を設けることができます(最初)

第二に、ユーザーが想定されているクラスの部分のみにアクセスできるメソッドを提供できます(これも、そのような方法でコーディングすることによって課される制限です)

そして私によると、プラットフォームの安全性よりもコードの安全性を心配する必要があります:)

于 2013-10-22T11:06:20.287 に答える
0
So, I mean to ask is when I can get address of the object (that too fully qualified address) in Java also, how it could be safe?
  • まず、オブジェクトへの参照は、オブジェクトへのポインターを意味しません。特定の規則によってオブジェクトを参照する限り、(理論的には)ダブルポインター、オフセット付きのトリプルポインター、またはその他のポインターである可能性があります。もちろん、最も単純な規則はオブジェクトへの直接ポインターですが、Java 言語は (私が知る限り) 実装の問題であるため、わざわざそれを詳しく説明することはありません。

  • Java は C や C++ とは異なる言語であるため、演算子に対して独自のセマンティクスを定義します。簡単に言えば、Java では & は「アドレス」演算子ではありません。言語設計者がそのように定義しているためです。参照が単純なポインターとして実装されているかどうかに関係なく、「アドレスの」演算子はありません。もちろん、この背後にある哲学は、ポインター演算とメモリの安全性を回避することです。

また、それ以外の場合、クラス A がプライベートであるため、そのオブジェクトを作成することはできませんが、このクラスのオブジェクトを作成するために使用されるこのクラス内にメソッドを作成するとどうなりますか。そして、このクラスのオブジェクトを作成したい場所ならどこでもこのメソッドを呼び出すだけです!!!

この質問は意味がないと思います。クラス A が内部クラスでない場合、クラス A をプライベートにすることはできません。

于 2013-10-22T11:09:39.747 に答える