クラスがロードされたら、静的初期化子を再度呼び出す方法はありますか?
public class Foo {
static {
System.out.println("bar");
}
}
編集:
元のクラスを記述しておらず、呼び出す必要があるロジックが静的初期化子に実装されているため、静的初期化子を呼び出す必要があります。
クラスがロードされたら、静的初期化子を再度呼び出す方法はありますか?
public class Foo {
static {
System.out.println("bar");
}
}
編集:
元のクラスを記述しておらず、呼び出す必要があるロジックが静的初期化子に実装されているため、静的初期化子を呼び出す必要があります。
初期化コードを別の public static メソッドに入れて、静的初期化子や他の場所から呼び出すことができるようにしますか?
ロジックが複数回実行される状況の 1 つは、クラスが異なる ClassLoader によって複数回ロードされる場合です。この場合、それらは本質的に異なるクラスであることに注意してください。
ただし、通常、これらは一度限りの取引です。ロジックを複数回呼び出すことができるようにしたい場合は、他の人が提案したようにして、それを静的メソッドに入れます。
Earwickerの答えに同意します。静的初期化を別の静的メソッドに抽出するだけです。
public class Foo {
static {
Foo.initialize();
}
public static void initialize() {
System.out.println("bar");
}
}
正確な質問に対する正確な答えが本当に必要な場合、答えはノーです。リフレクションを介して静的初期化子または instanceInitializer を呼び出すことはできません。
ドキュメントは明確に言っています:
の場合getDeclaredMethod(String name)
:
名前が「<init>」または「<clinit>」の場合、NoSuchMethodException が発生します。
の場合getDeclaredMethods()
:
返される配列には、クラスの初期化メソッドは含まれません。
いいえ、リフレクションを介しても呼び出すことはできません。
静的コードを含むクラスを拡張してから、独自の静的初期化子を配置してみてください。それが機能するかどうかはよくわかりませんが:
public class OldBadLibraryClass {
static {
System.out.println("oldBadLibrary static init");
}
}
//next file
public class MyBetterClass extends OldBadLibraryClass {
static {
System.out.println("MyBetterClass init");
}
}
public class Test {
public static void main(String[] args) {
new MyBetterClass();
}
}
上記が期待どおりに印刷されるかどうかを確認してください。私のマシンでは、それは機能しました。
これは完全にハックであり、非常に脆弱ですが。オーバーライドできるinit()メソッドを持つように、古いクラスを変更する方がはるかに優れています。