標籤:java 反射 淺析 基礎
Java反射機制淺析圖+應用執行個體
——轉載請註明出處:coder-pig
本節引言:
其實很久之前就想歸納一下Java中的這個反射機制了,前些天看了慕課網一個講反射機制的
視頻教程覺得不錯,又複習了一下,今天面試了一下午,回來就不想寫代碼了,就寫寫關於Java
反射的總結,寫些簡單的使用例子,最後找了2個Android中反射機制應用的例子,分別是
舊版本SDK利用AIDL + Java反射機制接聽與掛斷電話以及利用反射機制通過按鈕關閉
對話方塊,後續如果用到會另外總結~
本節本文:
1.反射的相關概念圖:
2.簡單的使用樣本:
我們寫個簡單的例子來理解Java反射機制的使用,其實就是通過Class類的相關方法實現而已!
我們先定義一個一個用來做示範的類:Test.java:
package com.jay.test;public class Test {private String s1;public int i1;public static float PI = 3.14159f;public Test() {System.out.println("我是無參的構造方法");}public Test(String s1) {super();this.s1 = s1;System.out.println("我是有一個參數的構造方法");}public Test(String s1,int i1){System.out.println("我是有兩個參數的構造方法");}public void sum(int a,int b){System.out.println("a+b = "+(a+b));}}
①擷取某個類的相關資訊:
public static void getTheClass(){Class class1 = Test.class;System.out.println(class1.getName());System.out.println(class1.getSimpleName());}
運行:
②擷取構造方法:
擷取構造方法就要通過Constructor這個API了:
提供四種可供調用的方法:
Constructor getConstructor(Class[] params)-- 獲得使用特殊的參數類型的公用建構函式,
Constructor[] getConstructors( ) -- 獲得類的所有公用建構函式
Constructor getDeclaredConstructor(Class[] params) -- 獲得使用特定參數類型的建構函式(與接入層級無關)
Constructor[] getDeclaredConstructors( )-- 獲得類的所有建構函式(與接入層級無關)
程式碼範例:
public static void getConstructor(){Class class1 = Test.class;Constructor[] cs = class1.getDeclaredConstructors();for(Constructor constructor:cs){System.out.print(constructor.getName() + "(");//擷取建構函式的參數列表的對應資料類型:Class[] ParamTypes = constructor.getParameterTypes();for(Class class2:ParamTypes){System.out.print(class2.getSimpleName() + ",");}System.out.println(")");}}
運行:
③擷取成員變數:
擷取相關的成員變數則要用到Field這個API了:
也是提供了四種可供調用的方法:
Field getField(String name) -- 獲得命名的公用欄位
Field[] getFields( ) -- 獲得類的所有公用欄位
Field getDeclaredField(String name) -- 獲得類聲明的命名的欄位
Field[] getDeclaredFields( )-- 獲得類聲明的所有欄位
程式碼範例:
public static void getField(){Class class1 = Test.class;Field[] fields = class1.getFields();for(Field field:fields){//得到成員變數的資料類型Class fieldType = field.getType();String TypeName = fieldType.getName();//獲得成員變數的參數名稱String filedName = field.getName();System.out.println(TypeName+" "+filedName);}}
運行:
④獲得相關方法:
擷取類中的相關方法就需要用到Method這個API了:
同樣也是提供了四個可供調用的方法:
Method getMethod(String name, Class[] params) -- 使用特定的參數類型,獲得命名的公用方法
Method[] getMethods( )-- 獲得類的所有公用方法
Method getDeclaredMethod(String name, Class[] params) -- 使用特寫的參數類型,獲得類聲明的命名的方法
Method[] getDeclaredMethods( )-- 獲得類聲明的所有方法,不考略許可權
程式碼範例:
①獲得類中所有的公用方法:
public static void getMethod(){Class class1 = Test.class;Method[] methods = class1.getMethods();for(int i = 0;i < methods.length;i++){//擷取方法傳回值Class returnType = methods[i].getReturnType();System.out.print(returnType.getName() + " ");//獲得方法名稱System.out.print(methods[i].getName() + "(");//擷取參數列表Class[] paramTypes = methods[i].getParameterTypes();for(Class class2:paramTypes){System.out.print(class2.getName() + ",");}System.out.println(")");}}
運行:
除了我們自訂的方法外,我們還看到了一些其他的方法,他們是父類提供的一些方法~
②利用反射調用相關方法:
程式碼範例:
public static void useMethod()throws Exception{Test test = new Test();Class class1 = test.getClass();Method method = class1.getMethod("sum", int.class,int.class);Object object = method.invoke(test, new Object[]{11,22});}
運行:
當然調用該方法的時候別忘了捕獲異常哦!
3.Android中使用反射執行個體:
關於在Android中的反射機制的一些執行個體,比如:Android 在1.1版本後就把接聽與掛斷的API給隱藏
了,我們就可以通過AIDL + 反射機制來調用ITelephony中的相關方法,鑒於篇幅,時間關係這裡就
不詳細示範講解,關於Android中反射機制的例子可參考下述資料:
①Android接聽與掛斷電話的實現:
http://blog.sina.com.cn/s/blog_5da93c8f0101g4wb.html
②利用反射機制通過按鈕關閉對話方塊:
http://blog.csdn.net/nokiaguy/article/details/5770263
ps:另外,貌似Android 4.1後上述電話中的方法就不可以了,高版本的解決方案如下:
http://bbs.51cto.com/thread-1078059-1.html
好了,關於Java反射淺析就暫時瞭解到這裡吧,後續遇到相關的再mark~
Java反射機制淺析圖+應用執行個體