JAvaベース(1)--反射

3524 ワード

反射とは
……
通常、プログラムは、書かれた各オブジェクトにアクセスし、オブジェクトを使用する方法です.反射により、プログラムはオブジェクトのタイプ、クラスのメソッド、クラスのメンバーなどの情報にアクセスでき、呼び出しオブジェクトのメソッドを反射することができる.
反射の効果
逆コンパイル:.classà.java
反射メカニズムによりjavaオブジェクトタイプ、メソッド、メンバー変数、構築メソッドにアクセスできます.
反射の使用方法
1.クラスのインスタンス・オブジェクトを取得するには、次の手順に従います.
1)Class.forName(「クラス名のフルネーム」)に例外処理を加える
2)クラス名.class //クラス(すべての書き込みクラスがjava.lang.Classのインスタンスオブジェクト)のclass静的メンバー変数を取得
3)オブジェクト.getClass() //クラスのオブジェクトでのgetClass()メソッド
Class c1 = Class.forName("test.javase.Student");//       ,      
Class c2 = Student.class;
Student s = new Student();
Class c3 = s.getClass();
 
  
System.out.println(c1.getName());//  c1  :test.javase.Student
System.out.println(c2.getSimpleName());  c2       :Student

2.クラス(クラスタイプ)を使用してクラスのオブジェクトインスタンスを作成します(つまり、c 1、c 2、c 3を使用してStudioのインスタンスを作成します):
 
  
Student s1 = (Student) c1.newInstance();//      

 
3.オブジェクトのメソッド情報の取得
Method[] m1 = c1.getMethods();//      public   ,         ,      
//getDeclaredMethods()               ,      

オブジェクトメソッドの名前、戻り値タイプ、パラメータタイプのリストなどを取得します.
m1[3].getName()//       
Class rx = m1[3].getReturnType()//          
Class[] px = m1[2].getParameterTypes();//            

 メソッドの情報を取得します(メソッドの名前とパラメータリスト決定メソッド)
Method m = c1.getMethod("setName",String.class);
Method m = c1.getMethod("getName");//       ,   new Class[]{}
//    , c1.getMethod("setName",String.class ,int.calss);  

c1.getMethod("setName",new Class[]{String.class ,int.calss })
//getMethod()  public   
//getDelcaredMethod()         

実行メソッド(invoke(クラスのオブジェクト名Object obj,メソッドのパラメータObject...args)を使用)
Student s1 = ……
Object o = m.invoke(s1,"lhx");
//       ,    new Object[]{}
//     “lhx”,“lhx”  new Object[]{“lhx”, “lhx”}

4.オブジェクトのメンバー変数情報の取得
Field[] fs = c1.getDeclaredFields();//                   
//getFields()         public        

オブジェクトのメンバー変数の名前、タイプなどを取得します.
 
  
for(Field field:fs){
    System.out.println(field.getName());//getName()         
    System.out.println(field.getType().getName());//getType()         (Class  )
}

 オブジェクトのメンバー変数情報の取得&&オブジェクトのメンバー変数の設定
Field f = c1.getDeclaredField("name");
Student s1 = ……
f.set(s1,"zrx");

5.オブジェクトのコンストラクション関数の情報を取得する
Constructor constructor = c1.getConstructor();//     
//getConstructors()      

System.out.println(constructor);//  public test.javase.Student()
System.out.println(constructor.getName());//  test.javase.Student

getname()の名前
getParameterType()のパラメータリスト
6.クラスの親を取得する&&インタフェースを実装する
getSupperclass()
getInterfaces()
 
反射による集合の汎用性の理解
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
list1.add(29);
list1.add("hello");
list2.add("hello");//list2.add(20)    

System.out.println(list1.getClass()==list2.getClass());//  true

上述のコードは、反射操作がコンパイル後の操作であることを示している:オブジェクト.getClass()はクラスタイプClassであり、「バイトコード」であり、集合の汎用型は入力エラーを防止し、コンパイル段階でのみ有効であり、コンパイルされた場合は無効である.以下のように:
 
  
Method method = list2.getClass().getMethod("add",Object.class);
method.invoke(list2,20);

これでlist 2に20を追加しました