在以前的項目架構的博文中,咱們提到了項目插件化架構,提到插件化架構不得不提的到Java中最強大的技術 —— Java 反射技術。java
反射包括如下技術:android
1. 根據一個字符串獲得一個類的對象。git
2. 獲取一個類的全部公有或者私有、靜態或實例的字段、方法、屬性。github
3. 對泛型類的反射。架構
經過一個對象,獲取它的類型。類型用Class表示,例如:框架
String str = "abc";
Class c1 = str.getClass();
這個方法用的最多。函數
經過一個字符串獲取一個類型。這個字符串由類的命名空間和類的名稱組成。而經過getSuperClass方法,獲取對象的父類型。例如:gradle
try { Class c2 = Class.forName("java.lang.String"); Class c3 = Class.forName("android.widget.Button"); // 經過getSuperClass獲取父類類型,每一個函數都有這個函數 Class c4 = c3.getSuperClass(); } catch(ClassNotFoundException e) { e.printStackTrace(); }
每一個類都有 class 屬性,能夠獲得這個類的類型。例如:spa
Class c2 = String.class; Class c3 = int.class;
基本類型,如BOOLEAN,都有TYPE屬性,能夠獲得這個基本類型的類型:插件
Class c2 = Boolean.TYPE;
Class c3 = Short.TYPE;
獲取類的構造函數,包括private和public兩種,支持無參數和有參數這兩種類型的構造函數。下面是獲取類構造函數的方式:
反射到類的構造函數很重要,由於反射技術的流程爲:經過字符串反射出一個類,而後經過反射獲取到類的構造函數,執行構造函數後就獲得了這個類的實例,有了這個實例就能夠經過反射進一步獲得實例的全部字段和方法。經過反射調用構造函數獲得類的實例,這要藉助Constructor的newInstance方法。
在經過反射構造函數獲取到類的對象後,咱們能夠執行如下操做:
Android 源碼系統中存在大量泛型,因此插件化技術離不開對泛型進行反射,好比單例模式。
調用Java提供的基本的反射語法,寫出來的代碼會很是艱澀。這裏咱們推薦一個相對天然、簡單、面向對象的開源庫 —— jOOR 庫。
jOOR庫只有兩個類,Reflect.java 和 ReflectException.java,導入這個庫不須要依賴gradle,能夠直接將這兩個類拖到項目中便可。
Reflect.java爲核心類,包含如下5個核心方法:
jOOR 雖然很強大,可是在Android領域使用時會存在必定的侷限性,由於在Android系統中不支持反射final類型的字段。
jOOR 庫 github 地址:https://github.com/jOOQ/jOOR 。
由於jOOR在Android開發時的侷限性,業界在使用反射開源框架都是基於基本反射語法自行封裝的框架。