程序员自我修养之IOC框架的思想
一、IOC理解、应用、实现
理解:有了 IOC 容器之后,创建对象和查找依赖的工作就交给框架完成,并由容器注入对象,这样通过 IoC 容器实现了类和类之间的解耦
应用:注入布局文件、注入views、注入views的事件监听
实现:注解、反射、动态代理
二、动态代理的使用三要素
1.有Proxy代理 : 给外界动态拿到实现的对象
2.具体拿到的对象
3.抽象接口 : 这个是给newProxyInstance去动态反射对象的参数使用
动态代理实现4.反射常见方法
补充一个:getClassLoader().loadClass(className(String 的类名))
Class.forName和ClassLoader.loadCLass的区别 getMethod和getDeclaredMetod的区别三、APT和IOC框架的区别
两者之间的区别四、使用动态代理+注解+反射实现
view.setOnLongClickListener(new View.OnLongClickListener()
简易版动态替换 IOC框架具体实现五、反射去加载一个未安装app的类
实现思想:原理和热修复相似
1.首先拿到app的安装目录路径
2.再拿到要加载的ClassLoader----》DexClassLoader
3.然后拿到未安装的DexPathList的对象
4.从DexPathList对象去拿到未安装的PluginElement的数组
5.把PluginElement和SrcElement合并为一个新的DesElement的数组
6.用DesElement替换已经安装的DexPathList的SrcElement
六、IOC如何使用热修复
1. 获取到apk的所有class
String path=getApplicationInfo(context.getPackageName(),0).sourceDir;
DexFile dexfile=newDexFile(path);
Enumeration entries=dexfile.entries();
while(entries.hasMoreElements()){
String name=(String)entries.nextElement();
if(name.contains(packageName)){
classList.add(name);}}
2.热修复的流程
a.首先获取当前用的的PathClassLoader
b.反射拿到DexPathList属性对象pathList
c.反射修改pathList的dexElements的属性
d.把补丁包path.dex转换为Element的数组
e.path+dexElements合并,并反射赋给pathList的dexElements数组
把.class文件转化为jar包的命令:
dx --dex --output=path.jar com/example/myapplication/Utils.class
七、反射修改系统的源码
PMS反射处理八、反射去启动一个未安装app的类
AMS代码处理 ActivityThread代理处理核心思想:
1. 先去反射IActivityManager对象,去拿到startActivity
2.做一个ProxyActivity通过动态代理去修改TestActivity,并把它转换为Intent的参数,并且保存原始TestActivity数据
3.反射ActivityThread的H(Handler)的对象
3.反射ActivityThread的mCallBack的对象,通过反射去执行代码,传入H的对象,然后去覆写handleMessage的LAUNCH_ACTIVITY,把ProxyActivity的Intent的数据替换为TestActivity的数据执行