Java反射機制淺析圖+應用執行個體

來源:互聯網
上載者:User

標籤: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反射機制淺析圖+應用執行個體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.