SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Javaのクラスローディングを制御する

異なるバージョンのクラスを同時にロードして利用する

  • X ポスト
  • このエントリーをはてなブックマークに追加

特定のクラスバージョンのロード

 さて、コンテナと制限付きクラスローダを使って、バージョン付きのクラスを格納しているコンポーネントを特定のアーカイブからロードできるようになりました。

 リスト2に、コンポーネントコンテナのテストクラスのコードを示します。このコードでは、コンポーネントコンテナのインスタンスを2つ作成し、それぞれを2つの異なるバージョンのHelloWorldコンポーネントに使う別々の設定ファイルの名前で初期化しています。その後、ComponentContainerクラスのcreateComponentメソッドによって各バージョンのコンポーネントがロードされ、インスタンス化されます。

リスト2 コンポーネントコンテナのテストクラス
package com.jeffhanson.components;
import junit.framework.*;
import java.net.URL;

public class ComponentContainerTest extends TestCase
{
   // ==============================================
   // static methods
   // ==============================================

   public static junit.framework.Test suite()
   {
      return new TestSuite(
         ComponentContainerTest.class);
   }

   // ==============================================
   // constructors
   // ===============================================

   public ComponentContainerTest(String name)
   {
      super(name);
   }

   // ==============================================
   // non-public methods
   // ==============================================

   private String doLoadComponentTest(
      ComponentContainer container,
      String componentName)
      throws ComponentNotFoundException
   {
      Object componentObj =
         container.createComponent(componentName);
      return componentObj.toString();
   }

   // ==============================================
   // public methods
   // ==============================================

   public void setUp()
      throws Exception
   {
      super.setUp();
   }

   public void tearDown()
      throws Exception
   {
      super.tearDown();
   }

   public void testLoadComponent1()
      throws Exception
   {
      String componentName =
         "com.jeffhanson.components.HelloWorld";

      ComponentContainer container =
         new ComponentContainer(
         "HelloWorldV1-CDI.xml");

      String componentStr =
         doLoadComponentTest(container,
         componentName);

      assertNotNull(componentStr);
      assertTrue(componentStr.equals(
         "Hello world V1!"));

      container = new ComponentContainer(
         "HelloWorldV2-CDI.xml");

      componentStr = doLoadComponentTest(
         container, componentName);

      assertNotNull(componentStr);
      assertTrue(componentStr.equals(
         "Hello world V2!"));
   }
}

 それぞれのコンポーネントオブジェクトのインスタンスを呼び出すと、適切なバージョンのコンポーネントによって処理されます。

 図3のシーケンス図は、フレームワークがコンポーネントをロードおよび作成する際の手順を示しています。

図3 コンポーネントのシーケンス。コンポーネントコンテナフレームワークがコンポーネントを作成する際のシーケンスを示している
図3 コンポーネントのシーケンス。コンポーネントコンテナフレームワークがコンポーネントを作成する際のシーケンスを示している

 RectrictedURLClassLoaderクラスへの呼び出しが、既定のクラスローダのインスタンスに到達せずに終了していることに注目してください。これにより、RestrictedURLClassLoaderインスタンスに与えられたURLでのみクラス検索が行われます。

 これで、クラスローディングを行うコンポーネントコンテナフレームワークの作成方法の説明は終わりです。このフレームワークによって、Javaコンポーネントの定義、バージョン管理、作成を行うための自己完結的なコンテキストを簡単に実現できるようになります。Javaのクラスローディング機能をこのような形で利用すると、クラスローディングを特定の場所に限定できるので、異なるバージョンのクラスを同時にロードできるようになります(これらのクラスはどちらも同じJVM上で作成、使用されます)。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Jeff Hanson(Jeff Hanson)

ソフトウェア業界で18年以上の経験を持つ。これまでにWindows OpenDocポートの上級エンジニア、NovellのRoute 66フレームワークの主席設計者を務める。現在は、J2EEベースの再保険システム用のフレームワークとプラットフォームの提供を専門とするeReinsureの主任設計者。著書、執筆記事多数。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/487 2006/08/22 15:51

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング