現在javaの機能の使用例を調べているのですが、以下の機能がプログラミングにどのように生かされているかご存じの方いらっしゃいますでしょうか?


- リフレクション
- クラスローダ

こんなアプリのこんな処理の部分に使われることが多いんじゃないかというような事例がわかると良いのですが。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2006/11/15 23:13:41
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント35pt

クラスローダーが複数存在する理由で思いつくのは

・単一の 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 オブジェクトに値を設定するなどの機能はリフレクションが無いとかなり難しくなります。

id:bopperjp

なるほど。ユースケースを理解できるようになってきました。ありがとうございます。

2006/11/15 23:13:03

その他の回答1件)

id:quintia No.1

回答回数562ベストアンサー獲得回数71

ポイント35pt

クラスローダ

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()メソッドは引数が無いコンストラクタしか呼び出せないので、リフレクションを使わざるをえません。

ただこれも緊急避難的な手段という感じがします。リフレクションを使わなくてもよい様に設計をするべきでしょう。

id:bopperjp

なるほど、かなり大がかなりフレームワーク向きの機能のようですね。

クラスローダ、リフレクションがあると、そのような機能がない時と比べて、「こんな機能の作り安さが格段に違う。」とかないでしょうか?

2006/11/12 11:40:39
id:b-wind No.2

回答回数3344ベストアンサー獲得回数440ここでベストアンサー

ポイント35pt

クラスローダーが複数存在する理由で思いつくのは

・単一の 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 オブジェクトに値を設定するなどの機能はリフレクションが無いとかなり難しくなります。

id:bopperjp

なるほど。ユースケースを理解できるようになってきました。ありがとうございます。

2006/11/15 23:13:03

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません