Javaで積極的なロードとは何ですか?

Pcdhn:

私は春の二つのクラスにJavaで積極的なロードに遭遇しているNestedRuntimeExceptionAbstractApplicationContext、これらのケースの両方が、静的コードブロックを使用して、同じクラスローダーの問題を解決するが、それらを使用する方法が混乱しています。

混乱がへの呼び出しに関してれる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");
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=227034&siteId=1