美文网首页Android 组件化、插件化
程序员自我修养之IOC框架的思想

程序员自我修养之IOC框架的思想

作者: 巴菲伟 | 来源:发表于2021-03-04 16:05 被阅读0次

    一、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的数据执行

    相关文章

      网友评论

        本文标题:程序员自我修养之IOC框架的思想

        本文链接:https://www.haomeiwen.com/subject/qktcqltx.html