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