15

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とString ofPropertiesFileを同じアドレスで等しくする必要があります。できれば、プロパティファイルをリッスンする必要はありません。

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

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

4

6 に答える 6

22

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

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

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

于 2009-09-01T06:37:07.823 に答える
13

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

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

于 2009-09-01T07:05:50.713 に答える
7

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

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

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

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

この方法を使用して、またはこの方法を使用して、このアドレスの値を変更できますputInt(Object,long offset, int value)(値を取得しますgetnt(Object))。

注:このクラスは実際には安全ではありません。プロジェクトで間違ったことをすると、JVMは停止します。

于 2014-12-24T09:15:50.750 に答える
1

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

于 2009-09-01T07:05:20.700 に答える
1

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

于 2009-09-01T11:15:52.083 に答える
1

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

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

于 2012-03-28T09:12:52.417 に答える