在以前的项目架构的博文中,咱们提到了项目插件化架构,提到插件化架构不得不提的到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开发时的局限性,业界在使用反射开源框架都是基于基本反射语法自行封装的框架。