Pcdhn:
私は春の二つのクラスにJavaで積極的なロードに遭遇しているNestedRuntimeException
とAbstractApplicationContext
、これらのケースの両方が、静的コードブロックを使用して、同じクラスローダーの問題を解決するが、それらを使用する方法が混乱しています。
混乱がへの呼び出しに関してれるClassName.class.getName()
静的コードブロック内を、この解決クラスローダの問題をどうしますか。
static {
// Eagerly load the ContextClosedEvent class to avoid weird classloader issues
// on application shutdown in WebLogic 8.1. (Reported by Dustin Woods.)
ContextClosedEvent.class.getName();
}
私はこれと同じ操作を行うとしたら、私はクラスローダを取得し、手動でこのクラスをロードします
Thread.currentThread()
.getContextClassLoader().loadClass(ContextClosedEvent.class.getName());
任意の専門家のアドバイスは理解されるであろう。
Escキーホタテ:
最初のケースでは、蛇腹一例として、ContextClosedEvent
とすぐにロードするYourClass
ために使用されます。
class YourClass {
static {
// Eagerly load the ContextClosedEvent class to avoid weird classloader issues
// on application shutdown in WebLogic 8.1. (Reported by Dustin Woods.)
ContextClosedEvent.class.getName();
}
}
後者の場合は、ContextClosedEvent
あなたのコードが実行されている場合、ロードされるloadClass
メソッドが2回呼び出されます。初めてのためであるContextClosedEvent.class
(JVMによって呼び出される)参照、二回目は、あなたの手動コールです。
最初の時間は、ContextClosedEvent
実際にクラスパスからロードされます。二回目は、それはあなたに依存しますContextClassLoader
。デフォルトでは、JVMのクラスローダはなりfindLoadedClass
代わりに再びクラスをロードします。
怒鳴る例として、loadClass
とき方法は二回呼び出されるmain
メソッドが実行されています。
class Main {
public static void main(String[] args) throws ClassNotFoundException {
Thread.currentThread()
.getContextClassLoader().loadClass(ContextClosedEvent.class.getName());
}
}
静的ブロックがどのように機能するかを確認するには、この例を実行します
class Main {
public static void main(String[] args) {
System.out.println("main method invoked");
}
static {
System.out.println("static block invoked");
}
}