Java オブジェクトのアドレスを取得するにはどうすればよいですか?[重複]
-
20-09-2019 - |
質問
この質問にはすでに答えがあります:
- 参照アドレスを取得する方法はありますか?[重複] 5 つの答え
Javaオブジェクトのアドレスを取得する方法はありますか?
質問はどこから来たのでしょうか?:まず、プロパティファイルを読み取り、ファイルからのすべてのデータがテーブルに配置されました。プロパティファイルは更新できます。それで、そのファイルを聞きたいのです。PropertyChangeSupport と PropertyChangeListener を使用してオブジェクトをリッスンします。
updatedStatus = new basit.data.MyString();
updatedStatus.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
//After changes "i", we inform the table model about new value
public void propertyChange(PropertyChangeEvent evt) {
Object objec=evt.getNewValue();
tableModel.setValueAt(objec.toString(), 0, 5);
}
});
updatedStatusが変更された場合は、テーブルを更新します。MyString クラスにはプライベート文字列「Value」があります。プロパティファイルを聞きたい。したがって、同じアドレスにある updatedStatus.value とプロパティ ファイルの文字列を等しくする必要があります。それができれば、プロパティファイルをリッスンする必要はありません。
updatedStatus.setValue(resourceMap.getString("HDI.Device.1.Name"));
StringBufferを使用しようとしましたが、達成できませんでした。だからこそ、質問させていただきました。
解決
まず - いいえ、あなたはJavaでオブジェクトのアドレスを取得することはできません。少なくとも、アドレス等なしデバッグ剤ではない純粋なJavaは、一つには、時間をかけて移動することができます。あなたはそれを必要としない。
第二に、それはあなたの説明に従うことが少し難しいですが、あなたは確かに<全角> はファイル自体への変更を聞かずに逃げることができなくなります。あなたはProperties
オブジェクトにファイルをロードしたらあなたは、具体的にそれをリロードしない限り、ディスク上のファイルへの以降の変更は、ののそのオブジェクトには表示されません。
基本的には、ファイルへの変更をリッスン(またはそれをポーリング)と(新しいProperties
にするか、既存の上書きのいずれか)その時点でファイルをリロードする必要があります。あなたがをかなりかどうかもは、アプリケーションに依存する文字列のコンテナの更新をリッスンする必要があります。
他のヒント
メモリ内のオブジェクトのアドレスを取得できます。さて、どうやって?それはそのようなものです。
Javaのsun.misc.Unsafeクラスを使用します。
新しい安全でないオブジェクトを作成し、 getAddress(Object)
;メソッドを実行すると、アドレスである長い値が返されます。
また、このクラスには多くのメソッドがあります。
このアドレスの値は次を使用して変更できます putInt(Object,long offset, int value)
または、このメソッドのように(値を取得する) getnt(Object)
).
注記:このクラスは本当に 危険 。プロジェクトで間違ったことをした場合、 JVM 止められます。
System.identityHashCode(obj)
は、次の最高のものを提供します。これは、デフォルトのObject.hashCode()
の実装に対応します。
API引用する:「適度に実用的である限り、クラスオブジェクトによって定義されたhashCodeメソッドは、これは、典型的に整数にオブジェクトの内部アドレスを変換することによって実現される(異なるオブジェクトについては異なる整数値を返し、これはありません実装技術はのJavaTMプログラミング言語では不要です。)」ます。
はApache Commonsの設定を調べてください。このライブラリは、(例えば)プロパティファイルの動的再読み込みをサポートしています。 ここを参照してください。
いくつかのファイルの変更かどうかを観察するための最良の方法は、SHA1やMDA5とハッシュ値を作成し、キャッシュ内の値を保存するための私見です。そして、あなたはすべての分、秒、そのスレッドを作成し、ファイルの変更を監視し、ファイル上のハッシュ値を作成する頻度によって決まります。だから、この2つの値を比較することができ、値が等しくない場合ので、あなたは、新しいファイルをリロードすることができます。
Java は C/C++ とは異なります。C++ では、アドレスを扱うことがよくあります (C++ プログラマーは概念呼び出しポインターを持っています)。しかし、残念ながらJavaではそうではありません。Java は非常に安全なので、そのアドレスに触れることはできません。
ただし、あなたのアイデアと同じかもしれない他の方法は、HashCode を使用することです。HEAP 上のアドレスに基づくオブジェクトの HashCode。