Open5
Java再入門
一通り基礎は学んだ。オブジェクト指向の実装やら設計も大体できる。その上で、さらに極めるためのスレッド。以下の教材をもとに学習。
組み込みクラスローダーとは
クラスローダーはJVMの機能の一つ。実行時に対象のクラスを検索してメモリにロードしている。JVMには組み込みクラスローダーがあり、以下のような構成となっている。誰がどのクラスをロードするか担当範囲が決められている。
なぜ委譲モデルで設計されているのか?
- コアAPIが自由に改ざんされるのを防ぐため。
- クラスの繰り返しロードを回避するため。
参考
Tomcatのクラスローダーについて
組み込みクラスローダー以外にも独自に追加することができる。例えばTomcatではwar単位でクラスローダーがメモリにロードしてくれる。
これにより隔離して実行でき、独立性が担保される。
このクラスローダーがないと、同名だがバージョン違いのライブラリを間違って使い、互換性がないために、ランタイムエラーになるなどのリスクがある。
参考
Webアプリケーションでxmlなどのファイルを読み込む方法
Tomcatなどではコンテキストごとにクラスローダーが用意されている。コンテキストとは、Webアプリケーションのwar単位。上で述べたように隔離する必要があるため用意されている。
.xmlなどファイルを読み込む場合は、どこのファイルを読み込むかで使うクラスローダーが変わってくる。
例えば、同じコンテキストの場合は、コンテキストクラスローダを使用する。一方でコンテキスト外のファイルを読み込む場合は別のクラスローダーを使用する必要がある。
ちなみに、クラスローダーではなくInputStreamReaderを使うという方法もある。
テキストデータを入力ストリームとして読み込むケース
- MySQLでblob型で保存されたテキストデータ
- ネットワークを経由して読み込むテキストデータ
上記のようなケースでは、BufferedReaderクラスでは読み込めない。InputStreamReaderで読み込み、Readerへ変換する必要がある。