Open5

Java再入門

Taiki UejoTaiki Uejo

組み込みクラスローダーとは

クラスローダーはJVMの機能の一つ。実行時に対象のクラスを検索してメモリにロードしている。JVMには組み込みクラスローダーがあり、以下のような構成となっている。誰がどのクラスをロードするか担当範囲が決められている。

なぜ委譲モデルで設計されているのか?

  • コアAPIが自由に改ざんされるのを防ぐため。
  • クラスの繰り返しロードを回避するため。

参考
https://qiita.com/yp2211/items/fd49e98b9a1a15622b20#なぜ委任モデルを設計するのですか

Taiki UejoTaiki Uejo

Tomcatのクラスローダーについて

組み込みクラスローダー以外にも独自に追加することができる。例えばTomcatではwar単位でクラスローダーがメモリにロードしてくれる。

これにより隔離して実行でき、独立性が担保される。

このクラスローダーがないと、同名だがバージョン違いのライブラリを間違って使い、互換性がないために、ランタイムエラーになるなどのリスクがある。

参考
https://atmarkit.itmedia.co.jp/ait/articles/0405/11/news088.html

Taiki UejoTaiki Uejo

Webアプリケーションでxmlなどのファイルを読み込む方法

Tomcatなどではコンテキストごとにクラスローダーが用意されている。コンテキストとは、Webアプリケーションのwar単位。上で述べたように隔離する必要があるため用意されている。

.xmlなどファイルを読み込む場合は、どこのファイルを読み込むかで使うクラスローダーが変わってくる。

例えば、同じコンテキストの場合は、コンテキストクラスローダを使用する。一方でコンテキスト外のファイルを読み込む場合は別のクラスローダーを使用する必要がある。

ちなみに、クラスローダーではなくInputStreamReaderを使うという方法もある。

Taiki UejoTaiki Uejo

テキストデータを入力ストリームとして読み込むケース

  • MySQLでblob型で保存されたテキストデータ
  • ネットワークを経由して読み込むテキストデータ

上記のようなケースでは、BufferedReaderクラスでは読み込めない。InputStreamReaderで読み込み、Readerへ変換する必要がある。