SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

japan.internet.com翻訳記事

プログラムの裏側:内部情報を得るためのJavaリフレクション

JavaリフレクションAPIを使用して、プログラムの内部構成のすべてを知る

ダウンロード サンプルソース (1.8 KB)

リフレクションを使用して属性を取得する

 クラスには、これまで見てきたもの以外にもさまざまな要素が含まれています。例えば、変数はどうでしょうか。リフレクションを使用すれば、このような要素についても詳細な出力を得られます。次に示すのは、Fieldクラスを使用した例です。

import java.lang.reflect.*;
 
public class DumpFields {
  public static void main(String args[])
  {
     try {
         Class c = Class.forName(args[0]);
         Field[] fields = c.getFields();
         for (int i = 0; i < fields.length; i++)
         System.out.println(fields[i].toString());
     }
     catch (Throwable e) {
        System.err.println(e);
     }
  }
}

 このコードをコンパイルし、Employeeを引数として実行すると、

java DumpFields Employee 

 次のような出力が得られます。

public java.lang.String Employee.empNum
public java.lang.String Employee.empName

 この結果には、このクラスに属するすべてのフィールドと属性が列挙されています。

リフレクションを使用してコンストラクタを取得する

 Constructorクラスを使用すると、使用可能な各種のコンストラクタとその使用方法を詳しく知ることができます。

import java.lang.reflect.*;
 
public class DumpConstructors {
  public static void main(String args[])
  {
     try {
         Class c = Class.forName(args[0]);
         Constructor[] constructor = c.getConstructors();
         for (int i = 0; i < constructor.length; i++)
         {
             System.out.println(constructor[i].toString());
            //To print the parameter types
            Class pvec[] = constructor[i].getParameterTypes();
            for (int j = 0; j < pvec.length; j++)
                System.out.println("param #" + j + " " 
                  + pvec[j]);
        }
 
     }
     catch (Throwable e) {
        System.err.println(e);
     }
  }
}

 このコードをコンパイルし、Employeeを引数として実行すると、

javac DumpConstructors Employee

 結果は、次のようになります。

public Employee(java.lang.String,java.lang.String)
param #0 class java.lang.String
param #1 class java.lang.String
public Employee()

 この結果を分析してみると、Employeeクラスには2つのコンストラクタがあることが分かります。最初のコンストラクタは、パラメータを持つコンストラクタです(パラメータの型も分かります)。2番目は引数をとらないコンストラクタで、特に説明の必要もないでしょう。

リフレクションを使用して実行時にクラスメソッドを実行する

 実行時に使用したいクラスがあると仮定しましょう。次のコードは、このクラスを実行時にロードして、目的のメソッドを実行する方法を示しています。ここで前提となっているのは、このメソッドの名前がsetPropertiesであり、java.util.Properties型の引数を1つとるということです。

Class newClass = null;
 
Method getInstanceMethod = null;
 
Properties prop = new Properties();
prop.put("argName", "argValue");
try
{
    Object obj = newClass.newInstance();
    getInstanceMethod = newClass.getMethod("setProperties", 
        new Class[]{new Properties().getClass()});
 
}
catch (Exception ex)
{
    //Exception in loading Class:" + ex.getMessage();
}

 このような柔軟性により、IDE開発者は極めて簡単にJavaをサポート対象プログラミング言語に加えることができます。

※注意

 ここまでは、JavaリフレクションAPIを使用する利点を説明してきましたが、リフレクションの欠点についても理解しておく必要があります。例えば、プロセスがよくわかっていないのにリフレクションをデバッグに使用すると、大変な目に遭います。リフレクションは、使用可能な他の方法と比較してメリットが多いと判断した場合にだけ、特定の問題の解決に使用してください。

参考資料

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

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

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

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

Sridhar M S(Sridhar M S)

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4055 2009/07/08 14:00

イベント

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

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

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

メールバックナンバー