2017-09-05 7 views
1

サードパーティのクラスでClass.forName()の束を呼び出す必要がありますが、影響を受けるすべてのクラスを静的初期化子で実行する必要があります。この静的初期化子の実行は、ロジックが他のすべての依存関係やその他のガベージ・プルを引き出すため、避けたいという望ましくない副作用です。クラス初期化子の実行を抑止する方法

これが実行されないようにする手段はありますか?私は、クラスのバイナリをハックすることによって得られる情報だけでなく、クラスのオブジェクトが必要です。

メソッドを呼び出す前に、クラスを適切に初期化する必要があることを知っています。私はこれらのクラスのコードで何もしていない、私はそれらを凍結したい。

+1

クラスオブジェクトが必要ですか、クラスが存在する情報と同じですか? –

+0

'Class'インスタンスで何をする必要がありますか?これが「非常にメタ」(メソッドシグネチャのリスト表示など)でない限り、そのクラスを初期化する必要があります。 Javaは「正しく」設定することなく、コードのいずれかを呼び出すことはできません。 – Thilo

+0

クラスをロードする必要がある場合は、途中で自分のVMを作成したり、既存のVMを変更したりしない限り、静的初期化を抑制することはできません。 – Turing85

答えて

1

クラスが持つすべてのものを含む実際のクラスに依存している場合は、仮想マシンにパッチを適用しない限り、静的な初期化子が問題になります。

クラスのメタ情報(クラスのメソッド名、実装されたインターフェイスなど)が必要な場合は、Reflectionsのようなライブラリを使用できます。

Powermock/Mockitoを使用して静的初期化を抑制する提案は、Reflectionsライブラリと同様の方向になります。どちらのテストフレームワークもロード前にクラスのバイトコードを変更するため、元のクラスとは若干異なるクラスになります。

関連する問題