クラスのライブラリを調べてウォークスルーするために、かなり重い反射を使用しています。静的フィールドとインスタンスの両方のフィールドを抽出して変更したいと思います。静的フィールドは簡単に見つけて変更できます。クラスを収集し、それらのフィールドのリストを要求し、フィールドを記録し、それらの値を検査/変更することができます。
インスタンスフィールドは異なります。Fieldオブジェクトへの参照を収集できますが、値を変更するには、そのタイプのオブジェクトをインスタンス化するコードを実行する必要があります。このコードが何をするのかわからないとしましょう。しかし、いくつかのオブジェクトをインスタンス化し、いくつかのコードを実行し、関心のあるライブラリを使用して処理を実行するメソッドblackBox()があります。実行後、クラス、C。
すべての静的フィールドのリストを収集し、それらの参照を十分に反復処理した場合、最終的にはコード内で存続しているすべてのインスタンスを見つけることができますか?つまり、私はそれを提案しています:
ガベージコレクションされていないJavaプログラムでインスタンス化されたすべてのオブジェクトには、静的フィールドで始まり、そのオブジェクトで終わる参照のチェーンが存在します。
これはJavaプログラムに関する一般的なルールですか?
編集:2つの追加の修飾子:
- スレッドを生成しないシーケンシャルプログラムにのみ興味があります。
- blackBox()の処理が終了し、ガベージコレクターが実行されたと想定しています。ライブラリ(moreBlackBox())を使用して、後で実行したいコードがさらにある可能性があります。アプリケーションが起動し、一時停止していると想像してください。