JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > リフレクション編  
メニュー
Home
情報交換掲示板
ツールの部屋
Java関連の書籍
アプリケーション編
Swing編
Swing(イベント)編
Swing(Look&Feel)編
アプレット編
iアプリ編
サーブレット編
サーブレット(Linux)編
サーブレット(web.xml)編
サーブレット(セッション)編
サーブレット(クッキー)編
サーブレット(フィルタ)編
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JSP(オブジェクト)編
JSP(カスタムタグ)編
JSP(データベース)編
Apache + Tomcat編
Struts編
JDBC編
JDBC(データソース)編
JDBC(MySQL)編
JDBC(PostgreSQL)編
JDBC(トランザクション)編
JavaMail(SMTP)編
JavaMail(POP)編
JNI編
RMI編
RMI(アプレット)編
CORBA編
JNDI編
EJB編
EJB(Entity Bean)編
JMS(PTP)編
JMS(Pub/Sub)編
XML(SAX)編
XML(DOM)編
XSLT編
SOAP編
国際化編
国際化(タイムゾーン)編
国際化(通貨)編
リフレクション編
コレクション編
コレクション(Set)編
コレクション(List)編
コレクション(Map)編
スレッド編
正規表現編
アサーション編
ログ機能編
サウンド編
ファイル入出力編
URL編
ソケット編
データグラム編
HTTP
FTP編
jar編
javadoc編
Ant編
外部コマンド編
プロパティファイル編
システムプロパティ編
Eclipse編
  2002/02/03  田中宏和
リフレクション編
◆リフレクションとは?
 リフレクションとはクラスのフィールド、メソッド、およびコンストラクタに関する情報を検出したり、その検出した情報でそのクラスを利用したりできるAPIです。
◆ここでの環境
OS Windows 2000
J2SE SDK 1.3.1_01
◆Java実行環境の構築
アプリケーション編を参考にJava実行環境を構築してください。
クラスとメソッドの名前を使ってのメソッドの実行
ここでは、クラスとメソッドの名前だけ使用してそのメソッドを実行してみることにします。
◆利用されるクラスのソースを作成
HelloWorldRef.java(ここからダウンロード)
public class HelloWorldRef {
  public String sayHelloWorld() {
    return "Hello World";
  }
}
◆メソッドを実行するクラスのソースを作成
ReflectionTest.java(ここからダウンロード)
import java.lang.reflect.Method;

public class ReflectionTest {
  public static void main(String args[]) {
    try {
      // クラスを取得
      Class cls = Class.forName("HelloWorldRef");
      // メソッドを取得
      Method method = cls.getMethod("sayHelloWorld",null);
      // メソッドを実行
      Object ret = method.invoke(cls.newInstance(),null);
      // 戻り値を表示
      System.out.println(ret);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
 
◆コンパイルと実行
コマンドプロンプト

C:\JavaHello\Refrection>javac HelloWorldRef.java ReflectionTest.java

C:\JavaHello\Refrection>java ReflectionTest
Hello World

C:\JavaHello\Refrection>

おおおお!!表示されましたね!
 
クラスがもつフィールド、コンストラクタ、メソッドの表示
リフレクションの主たる目的はクラスを分析することです。reflectionを辞書で引くと「反射、映像」とかいう意味が見当たります。さあ、それではクラスの中を映し出して見ましょう!
◆ソースコード
ReflectHelloWorld.java(ここからダウンロード)
import java.lang.reflect.*;

public class ReflectHelloWorld {
  public static void main(String[] args) {
    try {
      int i,j;

      // クラスの取得
      Class cls = Class.forName("java.lang.String");

      // フィールドの分析
      Field[] fieldList = cls.getFields();
      for (i=0;i<fieldList.length;i++) {
        Field fld = fieldList[i];
        // 修飾子を表示
        System.out.print(Modifier.toString(fld.getModifiers()));
        // 型を表示
        System.out.print(" " + fld.getType().getName());
        // フィールド名を表示
        System.out.println(" " + fld.getName() + ";");
      }
      System.out.println("");

      // コンストラクタの分析
      Constructor[] ctorList = cls.getConstructors();
      for (i=0;i<ctorList.length;i++) {
        Constructor ct = ctorList[i];
        // 修飾子を表示
        System.out.print(Modifier.toString(ct.getModifiers()));
        // クラス名(コンストラクタ名)を表示
        System.out.print(" " + ct.getDeclaringClass().getName());
        // 引数の型を表示
        Class[] cparamList = ct.getParameterTypes();
        System.out.print("(");
        for (j=0;j<cparamList.length;j++) {
          System.out.print(" " + cparamList[j].getName());
        }
        System.out.println(");");
      }
      System.out.println("");

      // メソッドの分析
      Method[] methList = cls.getMethods();
      for (i=0;i<methList.length;i++) {
        Method m = methList[i];
        // 修飾子を表示
        System.out.print(Modifier.toString(m.getModifiers()));
        // 戻り値の型を表示
        System.out.print(" " + m.getReturnType().getName());
        // メソッド名を表示
        System.out.print(" " + m.getName());
        // 引数の型を表示
        Class[] mparamList = m.getParameterTypes();
        System.out.print("(");
        for (j=0;j<mparamList.length;j++) {
          System.out.print(" " + mparamList[j].getName());
        }
        System.out.println(");");
      }
      System.out.println("");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
} 
 
ここでは、java.lang.Stringクラスを分析しています。(どのクラスでもOK)
 
◆コンパイルと実行
コマンドプロンプト

C:\JavaHello\Refrection>java ReflectHelloWorld
public static final java.util.Comparator CASE_INSENSITIVE_ORDER;

public java.lang.String( [C int int);
public java.lang.String( [B int int int);
public java.lang.String( [B int);
public java.lang.String( [C);
public java.lang.String( java.lang.String);
public java.lang.String( [B java.lang.String);
public java.lang.String( [B int int);
public java.lang.String( [B);
public java.lang.String( java.lang.StringBuffer);
public java.lang.String( [B int int java.lang.String);
public java.lang.String();

public int hashCode();
public int compareTo( java.lang.String);
public int compareTo( java.lang.Object);
public boolean equals( java.lang.Object);
public java.lang.String toString();
public int length();
public char charAt( int);
public void getChars( int int [C int);
public [B getBytes();
public [B getBytes( java.lang.String);
public void getBytes( int int [B int);
public boolean contentEquals( java.lang.StringBuffer);
public boolean equalsIgnoreCase( java.lang.String);
public int compareToIgnoreCase( java.lang.String);
public boolean regionMatches( int java.lang.String int int);
public boolean regionMatches( boolean int java.lang.String int int);
public boolean startsWith( java.lang.String);
public boolean startsWith( java.lang.String int);
public boolean endsWith( java.lang.String);
public int indexOf( java.lang.String);
public int indexOf( int int);
public int indexOf( int);
public int indexOf( java.lang.String int);
public int lastIndexOf( java.lang.String int);
public int lastIndexOf( int);
public int lastIndexOf( int int);
public int lastIndexOf( java.lang.String);
public java.lang.String substring( int int);
public java.lang.String substring( int);
public java.lang.CharSequence subSequence( int int);
public java.lang.String concat( java.lang.String);
public java.lang.String replace( char char);
public boolean matches( java.lang.String);
public java.lang.String replaceFirst( java.lang.String java.lang.String);
public java.lang.String replaceAll( java.lang.String java.lang.String);
public [Ljava.lang.String; split( java.lang.String);
public [Ljava.lang.String; split( java.lang.String int);
public java.lang.String toLowerCase( java.util.Locale);
public java.lang.String toLowerCase();
public java.lang.String toUpperCase();
public java.lang.String toUpperCase( java.util.Locale);
public java.lang.String trim();
public [C toCharArray();
public static java.lang.String valueOf( [C);
public static java.lang.String valueOf( [C int int);
public static java.lang.String valueOf( double);
public static java.lang.String valueOf( float);
public static java.lang.String valueOf( boolean);
public static java.lang.String valueOf( char);
public static java.lang.String valueOf( int);
public static java.lang.String valueOf( long);
public static java.lang.String valueOf( java.lang.Object);
public static java.lang.String copyValueOf( [C int int);
public static java.lang.String copyValueOf( [C);
public native java.lang.String intern();
public final native java.lang.Class getClass();
public final void wait( long int);
public final void wait();
public final native void wait( long);
public final native void notify();
public final native void notifyAll();


C:\JavaHello\Refrection>

おおおお!分析されましたね!!
 
(メモ)
"[B"とか"[C"とかいう引数や戻り値の型がありますがそれぞれ意味があります。
-- ClassクラスのgetName()メソッドで得られる文字列の意味について --
 B            byte
 C            char
 D            double
 F            float
 I            int
 J            long
 Lクラス名;   クラスまたはインタフェース
 S            short
 Z            boolean
 V            void 

配列の場合は先頭に"["がつきます。例えば、
[Ljava.lang.String; なら String[]
[[Ljava.lang.String; なら String[][]
 
■書籍
Java関連の書籍

 
  ネットで買えば断然お得!お買い物なら楽天市場
ツールの部屋 - Java関連の書籍 - デザインパターン - 情報交換掲示板 - HOME