web-dev-qa-db-ja.com

Javaオブジェクトのアドレスを取得する方法は?

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);
            }
        });

UpdateStatusが変更された場合は、テーブルを更新します。 MyStringクラスにはプライベート文字列 "Value"があります。プロパティファイルを聞きたい。したがって、updatedStatus.valueとString of PropertiesFileを同じアドレスで等しくする必要があります。できれば、プロパティファイルをリッスンする必要はありません。

updatedStatus.setValue(resourceMap.getString("HDI.Device.1.Name"));

StringBufferを使おうとしましたが、うまくいきませんでした。そういうわけで、私は質問をしました。

13
Iguramu

まず、-いいえ、Javaでオブジェクトのアドレスを取得することはできません。少なくとも、純粋ではありませんJavaデバッグエージェントなどがありません。たとえば、アドレスは時間の経過とともに移動する可能性があります。必要ありません。

第二に、あなたの説明に従うのは少し難しいですが、あなたは確かにしませんファイル自体への変更を聞かずに逃げることができます。ファイルをPropertiesオブジェクトにロードすると、それ以降のディスク上のファイルへの変更は、特にリロードしない限り、そのオブジェクトに表示されます表示されません

基本的に、ファイルへの変更をリッスン(またはポーリング)し、その時点でファイルをリロード(新しいPropertiesに書き込むか、既存のファイルを上書きする)する必要があります。 また文字列コンテナの更新をリッスンする必要があるかどうかは、アプリケーションによって異なります。

21
Jon Skeet

System.identityHashCode(obj)は、次善の策、つまりオブジェクトごとに一意の番号を提供します。これは、デフォルトのObject.hashCode()実装に対応します。

APIを引用すると、「合理的に実用的である限り、クラスObjectによって定義されたhashCodeメソッドは、個別のオブジェクトに対して個別の整数を返します(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法はJavaTMプログラミング言語では必要ありません。)」。

9
mfx

メモリ内のオブジェクトのアドレスを取得できます。さてどうやって?それはそのようなものです。

javaでSun.misc.Unsafeクラスを使用します。

新しい安全でないオブジェクトを作成し、getAddress(Object)を使用します。メソッドとそれはアドレスである長い値を返します。

また、このクラスには多くのメソッドがあります。

このアドレスの値は、putInt(Object,long offset, int value)を使用するか、このメソッドのように変更できます(値を取得するgetnt(Object))。

注:このクラスは実際には[〜#〜]安全ではない[〜#〜]です。プロジェクトで間違ったことをすると、[〜#〜] jvm [〜#〜]が停止します。

8

JavaはC/C++とは異なります。 C++では、アドレスを操作することがよくあります(C++プログラマーには概念呼び出しポインターがあります)。しかし、私はそれがJavaではないのではないかと心配しています。 Javaは非常に安全なので、アドレスに触れることはできません。

しかし、あなたの考えと同じかもしれない他の方法は、HashCodeを使用することです。 HEAP上のアドレスに基づくオブジェクトのHashCode。

1
hqt

ApacheCommons構成を調べます。このライブラリは、(たとえば)プロパティファイルの動的な再読み込みをサポートしています。 ここ を参照してください。

1

ファイルの変更があるかどうかを確認する最良の方法は、SHA1またはmda5でハッシュ値を作成し、その値をキャッシュに保存するIMHOです。そして、分、秒ごとに、ファイルの変更を監視する頻度に依存するスレッドを作成し、ファイルに対してハッシュ値を作成します。したがって、この2つの値を比較し、値が同等でない場合は、新しいファイルを再ロードできます。

1
fero46