写在前面:学习插件化开发推荐书籍《Android 插件化开发指南》,本系列博客所整理知识部分内容出自此书。

在之前的项目架构的博文中,我们提到了项目插件化架构,提到插件化架构不得不提的到Java中最强大的技术 —— Java 反射技术,反射技术基本是贯穿整个插件化最核心的基础技术,下图是本人整理的插件化在理解时需要了解或者学习的知识点:

本文我们先着重讲一下Java反射技术。

一、基本反射技术

反射包括以下技术:

1. 根据一个字符串得到一个类的对象。

2. 获取一个类的所有公有或者私有、静态或实例的字段、方法、属性。

3. 对泛型类的反射。

1.1 根据一个字符串得到一个类

a). getClass

通过一个对象,获取它的类型。类型用Class表示,例如:

String str = "abc";
Class c1 = str.getClass();

b). Class.forName

这个方法用的最多。

通过一个字符串获取一个类型。这个字符串由类的命名空间和类的名称组成。而通过getSuperClass方法,获取对象的父类型。例如:

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();
}

c). Class 属性

每个类都有 class 属性,可以得到这个类的类型。例如:

Class c2 = String.class;
Class c3 = int.class;

d). TYPE 属性

基本类型,如BOOLEAN,都有TYPE属性,可以得到这个基本类型的类型:

Class c2 = Boolean.TYPE;
Class c3 = Short.TYPE;

1.2 获取类的成员

a). 获取类的构造函数

获取类的构造函数,包括private和public两种,支持无参数和有参数这两种类型的构造函数。下面是获取类构造函数的方式:

  • 获取类的所有构造函数:通过Class.getDeclaredConstructors方法可以获取类的所有构造函数,包括public和private的构造函数,我们可以通过for循环遍历每一个构造函数。
  • 获取类的某个构造函数:通过Class.getDeclaredConstructor方法。

反射到类的构造函数很重要,因为反射技术的流程为:通过字符串反射出一个类,然后通过反射获取到类的构造函数,执行构造函数后就得到了这个类的实例,有了这个实例就可以通过反射进一步得到实例的所有字段和方法。通过反射调用构造函数得到类的实例,这要借助Constructor的newInstance方法。

b). 获取类的实例和方法并进行调用或者修改

在通过反射构造函数获取到类的对象后,我们可以执行以下操作:

  • 获取类的私有实例并调用。
  • 获取类的静态私有方法并调用。
  • 获取类的私有字段并修改。
  • 获取类的私有静态字段并修改。

1.3 对泛型类反射

Android 源码系统中存在大量泛型,所以插件化技术离不开对泛型进行反射,比如单例模式。

二、反射开源库 jOOR

调用Java提供的基本的反射语法,写出来的代码会非常艰涩。这里我们推荐一个相对自然、简单、面向对象的开源库 —— jOOR 库。

jOOR库只有两个类,Reflect.java 和 ReflectException.java,导入这个库不需要依赖gradle,可以直接将这两个类拖到项目中即可。

Reflect.java为核心类,包含以下5个核心方法:

  • on:包裹一个类或者对象,表示在此类或对象上进行反射。
  • create:调用构造方法。
  • call:方法调用,传入方法名和参数。
  • get:获取(field和method返回)值相关,会进行类型转换,常与call组合。
  • set:设置属性值。  

jOOR 虽然很强大,但是在Android领域使用时会存在一定的局限性,因为在Android系统中不支持反射final类型的字段。

jOOR 库 github 地址:https://github.com/jOOQ/jOOR 。

因为jOOR在Android开发时的局限性,业界在使用反射开源框架都是基于基本反射语法自行封装的框架。

Android 插件化开发(一):Java 反射技术介绍的更多相关文章

  1. 《Android插件化开发指南》面世

    本书在京东购买地址:https://item.jd.com/31178047689.html 本书Q群:389329264 (一)这是一本什么书 如果只把本书当作纯粹介绍Android插件化技术的书籍 ...

  2. Android插件化开发

    客户端开发给人的印象往往是小巧,快速奔跑.但随着产品的发展,目前产生了大量的门户型客户端.功能模块持续集成,开发人员迅速增长.不同的开发小组开发不同的功能模块,甚至还有其他客户端集成进入.能做到功能模 ...

  3. Android插件化开发---执行未安装apk中的Service

    欢迎各位增加我的Android开发群[257053751​] 假设你还不知道什么叫插件化开发.那么你应该先读一读之前写的这篇博客:Android插件化开发,初入殿堂 上一篇博客主要从总体角度分析了一下 ...

  4. Android 插件化开发(四):插件化实现方案

    在经过上面铺垫后,我们可以尝试整体实现一下插件化了.这里我们先介绍一下最简单的实现插件化的方案. 一.最简单的插件化实现方案 最简单的插件化实现方案,对四大组件都是适用的,技术面涉及如下: 1). 合 ...

  5. 详解Android插件化开发-资源访问

    动态加载技术(也叫插件化技术),当项目越来越庞大的时候,我们通过插件化开发不仅可以减轻应用的内存和CPU占用,还可以实现热插拔,即在不发布新版本的情况下更新某些模块.     通常我们把安卓资源文件制 ...

  6. 插件化开发—动态加载技术加载已安装和未安装的apk

    首先引入一个概念,动态加载技术是什么?为什么要引入动态加载?它有什么好处呢?首先要明白这几个问题,我们先从 应用程序入手,大家都知道在Android App中,一个应用程序dex文件的方法数最大不能超 ...

  7. Android插件化开发之解决OpenAtlas组件在宿主的注冊问题

    OpenAtlas有一个问题,就是四大组件必须在Manifest文件里进行注冊,那么就必定带来一个问题,插件中的组件都要反复在宿主中注冊.像Service,ContentProvider等组件眼下没有 ...

  8. 【我的Android进阶之旅】Android插件化开发学习资料

    1.目前开源的插件开发框架大致有哪些? 1. 任玉刚 的 dynamic-load-apk Github 地址:https://github.com/singwhatiwanna/dynamic-lo ...

  9. Android插件化开发,初入殿堂

    好久没有写博客了,这次准备写写我这几天的研究成果--Android插件化开发框架CJFrameForAndroid. 好久没有写博客了,这次准备写写我这几天的研究成果--Android插件化开发框架C ...

随机推荐

  1. 学会使用这些,你的Windows可能会焕然一新

    星选哥用Windows也已经好多年了,今天用室友的电脑才发现,桌面真可以影响一个人的心情,从而影响工作,学习,生活. 所以准备推荐一些好用且轻量的小工具,让你时时刻刻有个好心情. 室友的桌面(还有很多 ...

  2. ctf线下赛中关闭非法用户shell脚本

    linux中三类用户:根用户,虚拟用户,普通用户. 其中普通用户的UID一般介于500-6000之间. #!/bin/bash for uid in $( cat /etc/passwd | cut ...

  3. 02 jQuery中的事件、动画、复合函数

    jQuery中的事件 在JavaScript中,常用的基础事件有鼠标事件.键盘事件.window事件.表单事件.事件绑定和处理函数的语法格式如下 语法q 事件名 = "函数名()" ...

  4. jenkins + maven + nexus + [ svn 或 GitLab 或 GitHub ]

    目录 介绍 DevOps平台四大模块 针对DevOps开源项目 Jenkins 介绍 Maven 介绍 maven的核心概念介绍 SVN介绍 Nexus介绍 Maven私服的 个特性: 流程图 环境搭 ...

  5. 交互程序 Scanner类

    交互程序 1. Scanner类是标准Java类库的类 (1)提供一些方法用于交互式读入不同类型的输入数据,输入可以是不同的数据源,包括用户键入的数据和保存在文件中的数据(怎么弄). (2)将一个字符 ...

  6. map.entrySet().iterator()

    1.首先创建一个HashMap, Map map= new HashMap(); 2.Iterator iter= map.entrySet().iterator(); 首先是map.entrySet ...

  7. js中innerHTML和outerHTML的相同与不同

    innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML,包括标签. outerHTML  设置或获取对象及其内容的HTML形式,也就是标签和文本内容全都显示出来 innerText  ...

  8. 源码分析 RocketMQ DLedger 多副本存储实现

    目录 1.DLedger 存储相关类图 1.1 DLedgerStore 1.2 DLedgerMemoryStore 1.3 DLedgerMmapFileStore 2.DLedger 存储 对标 ...

  9. 带你从头到尾捋一遍MySQL索引结构(2)

    前言 Hello我又来了,快年底了,作为一个有抱负的码农,我想给自己攒一个年终总结.索性这次把数据库中最核心的也是最难搞懂的内容,也就是索引,分享给大家. 这篇博客我会谈谈对于索引结构我自己的看法,以 ...

  10. PlantUML Viewer Chrome 插件 画时序图

    PlantUML通过简单直观的语言来定义示意图 使用 Chrome+ PlantUML Viewer的插件画图 1,打开chrome网上应用店 2,搜索plantuml viewer 并添加 3,扩展 ...