Android 插件化开发(一):Java 反射技术介绍

时间:2022-09-22 13:01:29

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

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

Android 插件化开发(一):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. PHP流式上传和表单上传(美图秀秀)

    最近需要开发一个头像上传的功能,找了很多都需要授权的,后来找到了美图秀秀,功能非常好用. <?php /** * Note:for octet-stream upload * 这个是流式上传PH ...

  2. 转载:稀疏矩阵存储格式总结&plus;存储效率对比&colon;COO&comma;CSR&comma;DIA&comma;ELL&comma;HYB

    http://www.cnblogs.com/xbinworld/p/4273506.html 稀疏矩阵是指矩阵中的元素大部分是0的矩阵,事实上,实际问题中大规模矩阵基本上都是稀疏矩阵,很多稀疏度在9 ...

  3. &lbrack;已解决&rsqb; 点击 【Show in system explorer】Eclipse卡死,未响应

    新版的Eclipse自带了 [Show in system explorer] 功能很方便,有一天突然不好用了,点它Eclipse就卡死, 可能由以下原因导致的: (可能性最大)windows本身有问 ...

  4. iOS - 代码查看控制台打印内存使用情况:

    1.先导入: #import <mach/mach.h> 2.写此方法.单位为兆(M). void report_memory(void) { struct task_basic_info ...

  5. 初学Java ssh之Spring 第四篇

    今天我来学习学习Spring中Bean. 在Spring中原来还有<beans.../>标签啊,它相当于<bean.../>标签的老爸,老爸可以有很多个儿子,但是老爸只有一个哦 ...

  6. Object修改链表

    以前学习过链表的时候由于类型的接收不同,每次要重写链表 下面修改可用链表 class Link{ private class Node{ private Object data ; private N ...

  7. 关于js中window&period;location&period;href&comma;location&period;href&comma;parent&period;location&period;href&comma;top&period;location&period;href用法

    "window.location.href"."location.href"是本页面跳转 "parent.location.href"是上一 ...

  8. PHP之提升代码质量36计

    转载:https://www.binarytides.com/35-techniques-to-enhance-your-php-code/ 1.不要使用相对路径 常常会看到: require_onc ...

  9. 小程序 第一个学习示例&lpar;TodoList&rpar;

    1. 概述 1.1 说明 在微信开发者工具环境下开发一个简易的TodoList功能,以便能够进行学习与熟练小程序相关功能与信息.. 示例中,初步计划包含以下功能: 1.能够进行新增计划信息 2.计划信 ...

  10. ESP-IDF版本2&period;1&period;1

    版本2.1.1是一个错误修复版本.它包括对KRACK和BlueBorne漏洞的修复. 版本2.1.1的文档可在http://esp-idf.readthedocs.io/en/v2.1.1/上找到. ...