Java反射メカニズムを深く浅くする

3512 ワード

1.Java反射メカニズムとは
Javaの反射メカニズムは,プログラム実行時にどのクラスや他の属性やメソッドを完全に知ることができ,1つのオブジェクトの属性やメソッドを任意に呼び出すことができる.このような実行時の動的取得はJavaの反射メカニズムである.実はこれもJavaが動的言語の象徴である.
反射を一言で要約すると、実行時に知られたクラスとその完全な内部構造がロードされます.
2.Java反射メカニズムがある理由
なぜJavaの反射メカニズムを使うのでしょうか?
2つあると思います.
       1つ目は、反射の目的は未知のアプリケーションを拡張することです.例えば、これらのインタフェースを実現したdllがプラグインとして挿入される限り、いくつかのインタフェースを定義するプログラムを書きました.では、どうやって実現するのでしょうか.反射によって実現できます.dllをメモリにロードし、反射することでdllを呼び出す方法です.
       2つ目は、エンコーディングフェーズでそのクラス名を知らず、実行中にプロファイルからクラス名を読み込む場合、new ClassName()をハードコーディングすることはできません.このオブジェクトを作成するには、反射を使用する必要があります.
生活の中でよく見られる例は、Javaの反射メカニズムを使う理由を理解するのに役立ちます.あなたはホテルに入って、彼らがそれらの料理を持っていて、いくらかかるか分かりません.では、最初のことは何ですか.「ウェイターがメニューを持ってきてください」とメニューを指さして、「これにします.それにします」と言います.
3.反射API(java.lang.Reflect)を見る
Javaのクラス反射に必要なクラスは多くありません.Field、Constructor、Method、Class、Objectです.以下、これらのクラスについて簡単に説明します. Fieldクラス:クラスまたはインタフェースのプロパティに関する情報と、その動的アクセス権を提供します.反射されるフィールドは、クラス(静的)プロパティまたはインスタンスプロパティであり、反射クラスのプロパティをカプセル化するクラスと見なすことができることを簡単に理解します. Constructorクラス:クラスの単一の構築方法に関する情報とアクセス権を提供します.このクラスはFieldクラスと異なり,Fieldクラスは反射クラスの属性をカプセル化し,Constructorクラスは反射クラスの構造方法をカプセル化している. Methodクラス:クラスまたはインタフェース上の個別のメソッドに関する情報を提供します.反映されるメソッドは、抽象メソッドを含むクラスメソッドまたはインスタンスメソッドである可能性があります.このクラスは反射クラスメソッドをカプセル化するためのクラスであることは理解に難くない. Classクラス:クラスのインスタンスは、実行中のJavaアプリケーションのクラスとインタフェースを表します.列挙は一種であり、注釈はインタフェースである.各配列はクラスオブジェクトとしてマッピングされたクラスに属し、同じ要素タイプと次元数を持つすべての配列がクラスオブジェクトを共有します. Objectクラス:クラスごとにObjectをスーパークラスとして使用します.すべてのオブジェクト(配列を含む)がこのクラスのメソッドを実装します.
私たちはこれらのインタフェースを通じて何をすることができますか?
前述のAPIでは、次の機能が完了していることがわかります.
クラスの取得
A.     getClass()の運用  (各classにはこの関数があります)
                                    i.    String str = "abc";
                                  ii.    Class c1 = str.getClass();
 
B.     Class.forName()の運用(static methodが最もよく使われる)
                                    i.    Class c1 = Class.forName ("java.lang.String");
                                  ii.    Class c2 = Class.forName ("java.awt.Button");
C.     運用  .class構文
                                    i.    Class c1 = String.class;
                                  ii.    Class c2 = java.awt.Button.class;
                                iii.    Class c4 = int.class;
                                  iv.    Class c5 = int[].class;
D.     TYPE構文(primitive wrapper classes基本データ型パッケージクラスを用いたTYPE構文)
                                    i.    Class c1 = Boolean.TYPE;
package com.jwd;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Reflect {
	/**
	 * @param args
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws ClassNotFoundException {
		String str = "abc";
        Class c1 = str.getClass();
        Class c2 = Class.forName("java.lang.String");
        Class c3 = String[].class;
        Class c4 = Integer.TYPE;
		Method[] mh = c1.getDeclaredMethods();
        Method[] mh2 = c2.getDeclaredMethods();
        Method[] mh3 = c3.getDeclaredMethods();
        Method[] mh4 = c4.getDeclaredMethods();
        Field[] f1 = c1.getDeclaredFields();
        Field[] f3 = c1.getDeclaredFields();
        Constructor[] ct = c1.getDeclaredConstructors();
		for(Method a:mh){
			System.out.println(a.toString());
		}
		for(Field a:f3){
			//System.out.println(a.toString());
		}
		for(Constructor a:ct){
			//System.out.println(a.toString());
		}
	}

}