• ベストアンサー

Commons-Discovery.jarとは?

Commons-Discovery.jarとは一体どういう働きをしているのでしょうか? 公式http://commons.jakarta.jp/discovery/を読んだのですが クラスのインスタンス化やシングルトン(ファクトリ)クラスのライフサイクルの管理…という記述と 三行目以降の所与のJavaインターフェースを実装するクラスの場所を確認します…という記述の関連性が分かりません。 一体Commons-Discoveryはどういう働きをするものなのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • foxa-gogo
  • ベストアンサー率44% (38/85)
回答No.1

使ったことはないのですが、あるインターフェースを与えられたときに、その実装クラスを引っ張ってくるのに使えるみたいですね。 dependency injection, factory patternあたりで検索すると、なんでそんなことが必要なのか情報が見つかるかもしれません。 簡潔に書けば、このようなツールを提供する意図は、オブジェクトの生成(や削除)を隠蔽化するところにあると思います。 例えば、アイロン(Iron)というインターフェースがあるプログラムで、Iron iron = new ToshibaIron();と書かれていたら、Sanyoのアイロンを使いたくなったらnewしてるところを全部書き換えないといけません。Discoveryを使うと、java -DIron=ToshibaIron Mainのようなことができます。 また、アイロンが熱くなるまでかなり電気代がかかることから、5台のアイロンを余熱して、複数のコンポーネント間で使いまわしたいということになれば、また大変な作業になります。 しかし、あらかじめ((Iron)discover.newInstance(Iron.class)).makeMySuitLookGreat();なんて書いておけば、どういう風にインスタンスを使いまわそうが、ここのコードは変更する必要がなくなり、アプリケーションが変更に強くなります。

nagaia
質問者

お礼

大変参考になりました! ありがとうございます^^

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 実行可能jarファイルについて!

    実行可能jarファイルについて! java -jar Foo.jar Foo というやり方で、実行可能jarファイルにあるクラスの中から実行するクラスを指定できるという記述があったので、試してみたのですが、うまくいきません。 http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Doc/java_primer/ExecutableJarfile.html どうしても、マニフェストファイルに書かれたクラスが実行されてしまいます。 マニフェストファイルはこちらの内容になります。 Manifest-Version: 1.0 Rsrc-Class-Path: ./ geronimo-jta_1.1_spec-1.0.jar s2-dao-1.0.49.jar co mmons-logging-1.1.jar poi-3.0-FINAL.jar aopalliance-1.0.jar s2-dao-ti ger-1.0.49.jar junit-3.8.2.jar teeda-core-1.0.13-sp7.jar geronimo-ser vlet_2.4_spec-1.0.jar cglib-nodep-2.1_3.jar s2-extension-2.4.40.jar s 2-tiger-2.4.40.jar easymock-2.4.jar teeda-webunit-0.2.2.jar teeda-aja x-1.0.13-sp7.jar teeda-tiger-1.0.13-sp7.jar ojdbc6.jar easymockclasse xtension-2.4.jar commons-lang-2.4.jar javassist-3.4.ga.jar teeda-xmlu nit-0.1.0.jar log4j-1.2.13.jar teeda-extension-1.0.13-sp7.jar ognl-2. 6.9-patch-20090427.jar junit-4.4.jar junit-addons-1.4.jar s2-framewor k-2.4.40.jar h2-1.0.69.jar Class-Path: . Rsrc-Main-Class: jp.co.tsys.sfi.batch.execute.TagOutputExecute Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader jarファイルは、Eclipseの実行可能jarファイルの出力で、エクスポートしました。 よくみると、Main-ClassがEclipseのクラスになっているので、そこが違うのかな、と予想しています。 なぜ、Eclipseのエクスポートを使っているかというと、ライブラリのjarファイル群をjarファイルに取り込むのに便利だと思ったからです。 →これさえできれば、ほかの方法で構いません。 どうかよろしくお願いします!

    • ベストアンサー
    • Java
  • クラス関係とは

    質問させてください。 以下のページに、「インタフェースの実装はクラス関係に依存しません。」という記述がありますが、「クラス関係」とは何でしょうか。 http://www.javaroad.jp/java_interface1.htm 検索してもわかりませんでした。申し訳ありません。 どなたかご存知でしたらお教えください。

    • ベストアンサー
    • Java
  • jarファイル内のクラスをインスタンス化する

    http://homepage3.nifty.com/satoshis/java/memo.html#extension 上記のサイトを参考に、jarファイル内のクラスをインスタンス化しようとしているのですが、 clazz.newInstance(); を実行しようとすると、以下のようなエラーが発生します。 java.lang.IllegalAccessException: Class jp.co.AAAAA.BBBBB can not access a member of class CCCCC with modifiers "" at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:57) at java.lang.Class.newInstance0(Class.java:302) at java.lang.Class.newInstance(Class.java:261) at jp.co.loft.LogCut.main(LogCut.java:58) ※jp.co.AAAAA.BBBBB は実行クラス、CCCCCはjarファイル内のクラスです。 開発環境は、以下です。 eclipse2.1.1 + jdk1.5.0_02 どんな些細なことでもよいので、ご存知の方、ご教授願えないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • eclipseでjarファイル内のリソースファイルをうまく扱うには?

    こんにちわ。 私は今、windows XP + eclipse 3.1.1(日本語化済) でswingアプリケーションを作っています。 完成後は、実行可能jarファイルとして配布したいと考えています。 jarファイル内の画像ファイルを読み込んで、トグルボタンの アイコンに使いたいので、メインクラス内で、 jToggleButton1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/transition.jpg"))); という記述をしました。 「ファイル」→「エクスポート」→「jarファイル」 で、実行可能jarファイルを作ったときはちゃんと 画像が読み取れているのですが、 eclipseから直接実行をすると、以下のようなNullPointerException が発生してしまいます。 java.lang.NullPointerException at javax.swing.ImageIcon.<init>(Unknown Source) at DTT.getJToggleButton1(DTT.java:261) at DTT.getJPanel5(DTT.java:216) at DTT.getJScrollPane(DTT.java:203) at DTT.getJPanel(DTT.java:99) at DTT.initialize(DTT.java:478) at DTT.<init>(DTT.java:468) at DTT.main(DTT.java:458) (DTTという名前のアプリケーションなのです。。) jarに出力する場合と、eclipseから直接実行する場合で 記述を変える必要があるのでしょうか? それともデフォルト作業ディレクトリの指定などを適切に行えば 統一的に扱えるようになるのでしょうか? なにとぞよろしくお願いします。

    • ベストアンサー
    • Java
  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java
  • ArrayListはListのデフォルト実装とは?

    「ArrayListはListのデフォルト実装」と書いてあるのですが、どういう意味でしょうか? http://topickup.web.fc2.com/java/list_arraylist.html ■自分の理解 ・List … インターフェイス ・ArrayList … インターフェイスを実装するクラスの中の一つ。どの実装クラスを利用するかはユーザーが選択? ■疑問点 ・Listインターフェイスのリファレンスに、デフォルト実装について明記されているかと思ったのですが、見つかりません ・どこかに書いているのでしょうか? http://docs.oracle.com/javase/jp/7/api/java/util/List.html ・検索したら、似た言葉で「デフォルトメソッド」があるのですが、「デフォルト実装」と同じ意味でしょうか? ・「デフォルトメソッド」はJava8の新機能? Java7以下では使えない?

    • ベストアンサー
    • Java
  • インターフェイスと抽象クラス

    なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaのコンパイルがうまくいきません。

    現在javaのFileUploadクラスを使用してファイルをサーバへアップロードするアプリケーションを作成しております。 コンパイルにはANTを使用しています。 動作環境: WindowsXP sp2 jdk1.5.0_10 tomcat5.5.23 Apache Ant 1.7.0 現象: 作成したjavaファイルをコンパイルしようとするとDiskFileUploadクラスとFileItemクラスまたHttpSessionクラスのシンボルを見つけられませんとなりコンパイルが通りません。 環境変数: JAVA_HOME = "c:\Program Files\java\jdk1.5.0_10" ANT_HOME = "C:\Program Files\Apache Software Foundation\apache-ant-1.7.0" CATALINA_HOME = "C:\Program Files\Apache Software Foundation\Tomcat 5.5" path = "%JAVA_HOME%\bin;C:\Program Files\Apache Software Foundation\apache-ant-1.7.0\bin" CLASSPATH = ".;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet-api.jar;%CATALINA_HOME%\common\lib\commons-fileupload-1.2.jar;%CATALINA_HOME%\common\lib\commons-io-1.3.2.jar" となります。 tomcatのcommon\libがうまく参照できていないからなのでしょうか? とすればそれはなぜなのでしょうか? ご教授いただければと思います。よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Tomcat+Axis のサンプルで

    Apache-Axisを勉強中です。 ここhttp://yamaguch.sytes.net/~tora/java/axis.xmlのサンプルを試しているのですが、 エラーになってしまい悩んでいます。 OS:Win2kPro Java:j2sdk1.4.1_02 Tomcat:jakarta-tomcat-4.0.6 Axis:xml-axis-10 (説明を読んで、足りないjarファイルはbeta1から持ってきました) 環境変数 AXIS_HOME=c:\axis-10 AXIS_LIB=%AXIS_HOME%\lib CLASSPATH=.;%AXIS_LIB%\axis.jar;%AXIS_LIB%\clutil.jar;%AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-core.jar;%AXIS_LIB%\tt-bytecode.jar;%AXIS_LIB%\wsdl4j.jar;%AXIS_LIB%\log4j-1.2.4.jar;%AXIS_LIB%;%AXIS_LIB%\axis-ant.jar;%AXIS_LIB%\commons-discovery.jar;%AXIS_LIB%\xerces.jar;%CATALINA_HOME%\common\lib\mail.jar;%CATALINA_HOME%\common\lib\activation.jar;%CATALINA_HOME%\common\lib\servlet.jar;C:\j2sdk1.4.1_02\lib\tools.jar; 見出しHelloAxis以下書かれているとおりに勧めて、 実行すると > java HelloClient http://localhost:8080/axis/HelloAxis.jws "Boo" 以下のエラーとなってしまいます。 - Mapping Exception to AxisFault AxisFault faultCode: {http://xml.apache.org/axis/}Server.userException faultString: java.lang.RuntimeException: No compiler found in your classpath! (you may need to add tools.jar) faultActor: null faultDetail: stackTrace: java.lang.RuntimeException: No compiler found in your classpath! (you may need to add tools.jar) at org.apache.axis.components.compiler.Javac.&lt;init&gt;(Javac.java:111) at org.apache.axis.components.compiler.CompilerFactory.getCompiler(CompilerFactory.java:87) ~以下略~

    • ベストアンサー
    • Java
  • 同一クラスインスタンス名で別クラスのインスタンス作成方法(C++)

    下記ソース(Java)の処理をするような、C++の実装方法を教えていただきたいです。 【処理内容】 クラスBのインスタンスを保持しており、クラスBのインスタンス名と同一であるクラスAのインスタンス生成 ClassA A_Instance = (ClassA)Class.forName(B_instance.name).newInstance(); 要はクラスインスタンスの名前の求め方がわからないのです。それさえわかれば、newしてクラスポインタを返すメソッドを用意すれば何とかなると考えていますが。 ※C++のAPI一覧はどこにあるのだろうか・・・