Java中的反射,Java反射
反射,以前聽說過,一致認為,需要什麼樣的類,就寫什麼樣的類,不就成了,何必去探究別人類中元素,所以一直沒學習關於反射的東西,直到前幾天看到修改ListView的快速滑塊映像,看到需要用到反射
昨天也就看了看反射
先說概念
反射就是載入一個運行時才得知名稱的類,獲悉其完整構造,並產生對象屍體,或對其變數設定或調用方法
通俗地說就是瞭解類和修改類
瞭解類就是
從構造方法 、成員變數、方法、各元素的修飾符瞭解類
測試類別:
package test;public class MyObject {public int a ,b;public MyObject(){}public MyObject(int a, int b) {super();this.a = a;this.b = b;}public int sum(){return a+b;}public int minus(){return a-b;}public int multiply(){return a*b;}public int divide(){return a/b;}}
Class c = Class.forName("test.MyObject");
從構造方法
Constructor[] constructors = c.getConstructors();for(int i = 0;i<constructors.length;i++){System.out.println("------第"+i+"個方法----->>>"+constructors[i].toString());System.out.println("----->>方法名:"+constructors[i].getName());System.out.println("----->>修飾符:"+constructors[i].getModifiers());Class p[]= constructors[i].getParameterTypes();for(int j=0;j<p.length;j++){System.out.println("參數j:"+p[j]);}}成員變數
Field[] fields = c.getDeclaredFields();for(int i = 0 ;i<fields.length;i++){Field f =fields[i];System.out.println("------->>變數名:"+f.getName());System.out.println("------->>變數類型:"+f.getModifiers());System.out.println("----->>修飾符:"+f.getType());}
方法:
Method m[] = c.getDeclaredMethods();for(int i = 0;i<m.length;i++){System.out.println("------第"+i+"個方法----->>>"+m[i].toString());System.out.println("----->>方法名:"+m[i].getName());System.out.println("----->>修飾符:"+m[i].getModifiers());System.out.println("------>>傳回值 :"+m[i].getReturnType());Class p[]= m[i].getParameterTypes();for(int j=0;j<p.length;j++){System.out.println("參數j:"+p[j]);}}從上述幾個方面去瞭解類
下面就是通過反射去應用類
//建立類的對象Class[]p = new Class[2];p[0]=int.class;p[1]=int.class;Constructor constructor =c.getConstructor(p);Object object = constructor.newInstance(34 ,90); //修改成員變數Field fielda= c.getField("a");System.out.println("----->>改變前:"+fielda.get(object));fielda.setInt(object, 190);System.out.println("----->>改變後:"+fielda.get(object));//調用類的方法Method method1 = c.getMethod("sum");Object sum = method1.invoke(object);System.out.println("--->>加=="+sum);