標籤:路徑 cat 成員 tty for ati rem 父類 方法
1.類的 類類型(ClassType)
類的類類型可以用來做很多事,我們可以通過它擷取到類的名稱,類的路徑,類的成員變數,類的方法等等,還可以通過它獲得類的執行個體化對象。
我們可以通過 類名.class 來得到類的類類型,如下面的 c1
Class c1 = ReflectDemo.class;
我們可以通過類的執行個體對象得到類的類類型
ReflectDemo demo1 = new ReflectDemo();Class c2 = demo1.getClass();
還可以通過類的包路徑加類名獲得類的類類型
Class c3 = Class.forName("reflectdemo.ReflectDemo");
值得注意的是,每個類只有一個類類型,也就是說上面的 c1, c2 , c3 指向的是同一個對象。
在開頭也說了,類的類類型同樣可以得到類的執行個體,所以兩者可以相互得到。
類自身,類的類類型 和 類的執行個體對象 的關係如:
2.通過類的類類型擷取類的成員變數以及方法
自己寫了一個方法,通過傳入某個類的執行個體對象,就能得到該類的方法。
其中 getMethod() 方法是擷取類中所有public方法,包括父類的 public 方法;getDeclareMethod()方法可以擷取本類中聲明的所有方法,不論許可權
public static void getClassMethods(Object obj){ Class c = obj.getClass(); //擷取類類型 Method []ms = c.getMethods(); //擷取類中所有的public方法,包括父類中的方法 Method []ms2 = c.getDeclaredMethods(); ////擷取該類自己聲明的所有方法,不論許可權 Field []fields = c.getFields(); //擷取類中public級成員變數 for(Field f:fields){ String fieldType = f.getType().getSimpleName(); //獲得成員變數類型 String fieldName = f.getName(); //獲得成員變數名 System.out.println(fieldType+" "+fieldName); } for(Method m:ms){ String type = m.getReturnType().getName(); //方法的傳回值類型 System.out.print(type+" "); String methodName=m.getName(); //方法名 System.out.print(methodName+"("); Class []params = m.getParameterTypes(); //方法中 參數的類類型 元組 for(Class param:params){ String parName = param.getName(); //從參數類類型中得到參數名 System.out.print(parName+" "); } System.out.println(");"); } }
3.通過反射來操作方法
除了上面通過getMethods()和getDeclaredMethods()擷取方法數組之外,還可以通過getMethod()和getDeclaredMethod()來對單個方法進行尋找。
這時就要注意,想要定位一個方法,必須要傳入正確的方法名以及參數類類型才行。如下:
public class ReflectDemo2 { public void print(){ System.out.println("a+b"); } public String add(String a,String b){ return a+b; } public int add(int a,int b){ return a+b; }}
我們想要擷取對應的方法就要進行如下操作:
ReflectDemo2 demo=new ReflectDemo2(); Class c=ReflectDemo2.class; try { //通過傳入的方法名稱和參數類類型來獲得某一確定方法的類類型// Method m1=c.getMethod("add", new Class[]{int.class,int.class}); //第一個參數為方法名,後面既可以傳入一個類類型數組,也可以單獨地傳入類類型 Method m1=c.getMethod("add",int.class,int.class); Object obj = m1.invoke(demo, 10,20); //通過invoke()來執行方法,要傳入類的執行個體對象以及對應參數的值 System.out.println(obj); Method m2=c.getMethod("print"); //如果沒有參數要傳入,直接輸入方法名即可 m2.invoke(demo); //如果方法沒有傳回值,可以不用擷取 } catch (Exception e) { e.printStackTrace(); } }
結果和平常使用類的執行個體對象調用方法的結果是一樣的。
待編輯。。
java反射的學習