- リフレクション
- クラスローダ
こんなアプリのこんな処理の部分に使われることが多いんじゃないかというような事例がわかると良いのですが。
クラスローダーが複数存在する理由で思いつくのは
・単一の JavaVM から複数アプリケーションを実行する場合。
複数クラスローダーを使う事で相互のクラスの違いによる干渉を防げる。Servlet/JSP アプリケーションサーバーでよく使われている。
・クラスのロードをダイナミックに行う場合。
プラグイン形式の拡張機能を後から読み込むなどロードのタイミングをコントロールできる。
文字列からクラスを生成出来るので、同一インターフェイスの別実装の切り替えを設定ファイルで行う等
リフレクションはユーザーが直接使うのはあまり多くないですが、フレームワーク内では多用されています。
http://www.atmarkit.co.jp/fjava/rensai3/struts01/struts01_1.html
http://www.atmarkit.co.jp/fjava/rensai3/springdi01/springdi01_1....
等です。
たとえば、
http://www.atmarkit.co.jp/fjava/rensai3/springdi01/springdi01_2....
このように設定ファイルから Java オブジェクトに値を設定するなどの機能はリフレクションが無いとかなり難しくなります。
クラスローダ
Webアプリケーションサーバで使われています。1つのアプリケーションサーバで別々のアプリを実行するときに、アプリごと(コンテナごと)にクラスローダを別にします。
1つはセキュリティ的な意味合いで、あるWebアプリが(同じアプリケーションサーバで実行中の)別のWebアプリのクラス(java.lang.Classクラスのインスタンス)を読み込んだりできなくするために、クラスローダを分けます。
1つはWebアプリケーションサーバ自体を再起動せずに、Webアプリケーションをアップデートしたいという理由で使います。古いバージョンのWebアプリを読み込んだクラスローダ(のインスタンス)を破棄して、新しくクラスローダのインスタンスを生成する感じでしょうか。
1つは、同じWebアプリの別バージョンを1つのサーバで実行したいなどの理由です。完全クラス名が同じで仕様が違うクラスを同時に使うために、クラスローダを分けます。
http://www.atmarkit.co.jp/fjava/javatips/049jspservlet025.html
http://www.jajakarta.org/tomcat/tomcat5.0/ja/docs/tomcat-docs/cl...
リフレクション
こちらは必要になる局面は少ない様に思います。
1つだけ。Javaでは引数付きコンストラクタを利用して動的にインスタンスを生成したい場合ぐらいでしょうか? ClassクラスのnewInstance()メソッドは引数が無いコンストラクタしか呼び出せないので、リフレクションを使わざるをえません。
ただこれも緊急避難的な手段という感じがします。リフレクションを使わなくてもよい様に設計をするべきでしょう。
なるほど、かなり大がかなりフレームワーク向きの機能のようですね。
クラスローダ、リフレクションがあると、そのような機能がない時と比べて、「こんな機能の作り安さが格段に違う。」とかないでしょうか?
クラスローダーが複数存在する理由で思いつくのは
・単一の JavaVM から複数アプリケーションを実行する場合。
複数クラスローダーを使う事で相互のクラスの違いによる干渉を防げる。Servlet/JSP アプリケーションサーバーでよく使われている。
・クラスのロードをダイナミックに行う場合。
プラグイン形式の拡張機能を後から読み込むなどロードのタイミングをコントロールできる。
文字列からクラスを生成出来るので、同一インターフェイスの別実装の切り替えを設定ファイルで行う等
リフレクションはユーザーが直接使うのはあまり多くないですが、フレームワーク内では多用されています。
http://www.atmarkit.co.jp/fjava/rensai3/struts01/struts01_1.html
http://www.atmarkit.co.jp/fjava/rensai3/springdi01/springdi01_1....
等です。
たとえば、
http://www.atmarkit.co.jp/fjava/rensai3/springdi01/springdi01_2....
このように設定ファイルから Java オブジェクトに値を設定するなどの機能はリフレクションが無いとかなり難しくなります。
なるほど。ユースケースを理解できるようになってきました。ありがとうございます。
なるほど。ユースケースを理解できるようになってきました。ありがとうございます。