Java反射メカニズム乾物総括(一)

6210 ワード

一、初歩的な認識反射####
反射を使用すると、開発ツールが新しい追加クラスを動的にクエリーする能力を迅速に適用できます.クラス能力を解析できるプログラムを反射と呼ぶ.反射メカニズムの機能は極めて強力で、私たちはそれを使用することができます.
  • 実行中にクラスを分析できる
  • 実行中にオブジェクトを表示します.たとえば、すべてのクラスで
  • を使用するためのtoStringメソッドを作成します.
  • は、汎用的な配列操作コード
  • を実現する.
  • Methodオブジェクトを利用して、このオブジェクトはC++の関数ポインタ
  • に似ています.
    二、Class類###
    プログラム実行中、Javaランタイムシステムは常にすべてのオブジェクトに対してランタイムと呼ばれるタイプ識別を維持します.この情報は、各オブジェクトが属するクラスを追跡します.仮想マシンは、ランタイムタイプ情報を使用して、対応するメソッドを選択して実行します.これらの情報を保存するクラスはClassと呼ばれ、このクラスを取得するには3つの一般的な方法があります.
  • ObjectクラスのgetClass()メソッドは、Classタイプのインスタンス
  • を返します.
    Date d = new Date();
    Class c1 = d.getClass();
    String name = c1.getName();  // name is set to "java.util.Date"
    
  • はまた、静的方法forNameを呼び出してクラス名に対応するClassオブジェクト
  • を得ることもできる.
    String className = "java.util.Date";
    Class c1 = Class.forName(className);
    
  • Tが任意のJavaタイプの場合、T.classは一致するクラスオブジェクトを表します.例:
  • Class c1 = Date.class;  //  if you import java.util.*;
    Class c2 = int.class;
    Class c3 = Double[].class;
    

    三、捕獲異常###
    Class.forNameメソッドは、チェックされた例外を放出します.チェックされた例外を放出する可能性のある1つ以上のメソッド呼び出しコードをtryブロックに配置し、catch句にプロセッサコードを提供します.次の例を示します.
    try{
             String mame = ""; //get class name
             Class c1 = Class.forName(name); //might throw exception
             do something with c2
           }catch (Exception e) {
              e.printStackTrace();
           }
    }
    

    クラス名が存在しない場合、tryブロックの残りのコードはスキップされ、catch句に直接プログラムが入ります.java.lang.Class 1.0
    static Class forName(String className)
    //       className Class  。
    Object newInstance()
    //           
    

    四、反射分析類を利用する能力###
    次に、反射メカニズムの最も重要な内容を簡単に説明します.java.long.reflectパッケージには、クラスのドメイン、メソッド、コンストラクタを記述するために3つのクラスField、Method、Constructorがあります.この3つのクラスには、プロジェクトの名前を返すためのgetName()という方法があります.各クラスごとにどのような方法があるかは、以下で具体的に説明します.
    Modifier情報の取得###
    try{
        //        (if != Object)        name java.util.Date
         Class cl = Class.forName(name);
         Class supercl = cl.getSuperclass();
         System.out.println(cl.getModifiers());
         String modifiers = Modifier.toString(cl.getModifiers());
         if(modifiers.length()>0) System.out.println(modifiers + " ");
         System.out.println("class " + name);    
         if(supercl!=null&&supercl!=Object.class)   //Date    Object
         System.out.println("extends"+supercl.getName());
        }catch (Exception e) {
            e.printStackTrace();
        }
    
            :
        1
        public 
        class java.util.Date
    

    PS:classクラスのgetModifiers()メソッドは、対応する権限に対応する整形値を返し、Modifier.toString(cl.getModifiers())で対応する修飾子を印刷することができます.
    Constructor情報の取得####
    public static void printConstructors(Class cl){   //    Class       
    
         Constructor[] constructor = cl.getDeclaredConstructors();
         for(Constructor c : constructor){
            String name = c.getName();
            System.out.print("  ");
            String modifiers = Modifier.toString(c.getModifiers());
            if(modifiers.length()>0) System.out.print(modifiers+" ");
            System.out.print(name + "(");
            //       
            Class[] paramTypes = c.getParameterTypes();
            for(int j = 0 ; j < paramTypes.length; j++){
               if(j>0) System.out.print(",");
               System.out.print(paramTypes[j].getName());
            }
            System.out.println(");");
         }
    }
            :
        ----  printConstructors()  
        public java.util.Date(java.lang.String);
        public java.util.Date(int,int,int,int,int,int);
        public java.util.Date(int,int,int,int,int);
        public java.util.Date();
        public java.util.Date(long);
        public java.util.Date(int,int,int);
    

    Method情報の取得####
    public static void printMethods(Class cl){    //    Class     
          Method[] methods = cl.getDeclaredMethods();
          for(Method m : methods){
              Class retType = m.getReturnType();
              String name = m.getName();
              System.out.println("  ");
              //      ,         
              String modifiers = Modifier.toString(m.getModifiers());
              if(modifiers.length()>0) System.out.print(modifiers + " ");
              System.out.print(retType.getName() + " " + name + "(");
              //       
              Class[] paramTypes = m.getParameterTypes();
              for(int j = 0 ; j < paramTypes.length ; j++){
                  if(j > 0) System.out.print(",");
                  System.out.print(paramTypes[j].getName());
              }
              System.out.println(");");
           }
    }
            :(       ,         )
        ----  printMethods()  
        public boolean equals(java.lang.Object);
        public java.lang.String toString();
        public int hashCode();
        public java.lang.Object clone();
        public volatile int compareTo(java.lang.Object);
        public int compareTo(java.util.Date);
        private void readObject(java.io.ObjectInputStream);
        private void writeObject(java.io.ObjectOutputStream);
    

    Field情報の取得#####
    public static void printFields(Class cl){  //    Class    fields
          Field[] fields = cl.getFields();
          for(Field f : fields){
             Class type = f.getType();
             String name = f.getName();
             System.out.print("   ");
             String modifiers = Modifier.toString(f.getModifiers());
             if(modifiers.length() > 0) System.out.print(modifiers + " ");
                System.out.println(type.getName() + " "+name+ ";");
           }
    }
      //       Date         ,       
    

    PS:ClassクラスのgetFields()getMethods()、およびgetConstructors()メソッドは、スーパークラスの共有メンバーを含むクラスが提供するpublicドメイン、メソッド、およびコンストラクタ配列をそれぞれ返します.ClassクラスのgetDeclareFields()getDeclareMethods()、およびgetDeclaredConstructors()メソッドは、クラスに宣言されたドメイン、メソッド、およびコンストラクタのすべてを返します.プライベートおよび保護されたメンバーが含まれますが、スーパークラスのメンバーは含まれません.上記3つのクラスで異なるパラメータを取得するメソッドの戻り値のタイプはClassであり、Method.getReturnType()Method.getParameterTypes()およびConstructor.getParameterTypes()などのメソッドの戻り値はClass[]タイプである.