|
| |
 |
リフレクション編 |
 |
◆リフレクションとは? |
| リフレクションとはクラスのフィールド、メソッド、およびコンストラクタに関する情報を検出したり、その検出した情報でそのクラスを利用したりできる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 |