http://www.javageeks.com/Papers/ClassForName/index.html
より。
JDK1.0 - 1.2の境目で発生した、ClassLoaderの委譲モデルの変更点とその影響の解説、がメインといえばメインなんだけど、SunのJavaVMにおけるClassLoaderの構成や、JavaVMSpecの2nd以降のClassLoaderの親子関係、委譲モデル、Extension ClassLoaderに読み込ませるときの問題点などを丁寧に扱っている。
惜しむらくは、親サイトの
http://www.javageeks.com/index.html
のリンクが色々とおかしくなってて現状機能していない事か。
まあPDFはローカルにDLしたからいいけど。
ClassLoader周りは、この辺りの「基本」が分かっていないとTomcatや各種APの該当解説ページを見ても「何を言っているのか理解不能」な領域である為、こういうのがあると非常に助かる。
ExtClassLoader(JAVA_HOME/lib/ext*.jarを自動ロードするClassLoader)から読み込まれたクラス内で、CLASSPATH上にあるクラスをClass.forName()で牽こうとすると、クラスが見つからない。何故か。それはExtClassLoaderの親がBootstrapClassLoaderになってしまうため、CLASSPATHが検索対象に入らないからだ。
で、上記PDFではその解決方法としてThead.getContextClassLoader()で取得したCLを、Class.forName(完全限定名, クラスの初期化是非, CL)に渡す手法が述べられている。
確かに、ThreadをCLASSPATH以降でロードされたクラス内で生成するのであればこの手法が間違いない。但し実際にTomcatのCLツリーなどは専用のドキュメントが用意されているほど独特なので、そちらに合わせるが吉、か。
コメント