1

システムクラスローダーがアプリケーションのクラスロードを引き継ぐことを期待しています。したがって、プログラムを次のように実行すると、

java -Djava.system.class.loader=MyClassLoader Main

アプリケーション内でクラスのロードを制御できるように、MainがMyClassLoaderによってロードされることを期待しています。しかし、それは起こりません。Mainは、Mainから参照される他のクラスと同様に、デフォルトのシステムクラスローダー(sun.misc.Launcher $ AppClassLoader)によって引き続きロードされます。ただし、getSystemClassLoader()を呼び出すと、MyClassLoaderのインスタンスが返されます。

これはどのように役立ちますか?Mainがカスタムシステムクラスローダーによってロードされるのは意味がありませんか?アプリケーションのクラスの読み込みを制御するにはどうすればよいですか?そして、誰がgetSystemClassLoader()値を使用しますか?

4

1 に答える 1

1

URLClassLoaderオーバーライドせずにサブクラス化しただけの場合、これはドキュメントに記載されている動作です

URL は、最初に親クラス ローダーを検索した後、クラスおよびリソースに対して指定された順序で検索されます。

親クラス・ローダーがクラスをロードできる場合はロードし、そのクラスについて報告されたローダーが親クラス・ローダーになります。Java クラスローダのデフォルトであるこの親優先のクラスローディング ポリシーを元に戻すには、 をオーバーライドする必要がありますloadClass

于 2012-11-11T11:42:36.427 に答える