什么是AOP?
AOP和OOP一样,是一种程序设计思想。
程序设计有六大原则,其中第一原则就是单一职责原则。意思就是一个类只负责一件事情。这与OOP的封装特性相得益彰。在这个条件下,我们的程序会被分散到不同的类、不同的方法中去。这样做的好处是降低了类的复杂性,提高了程序的可维护性。但是同时,它也使代码变得啰嗦了。例如,我们要为方法添加调用日志,那就必须为所有类的所有方法添加日志调用,尽管它们都是相同的。为了解决上述问题,AOP应运而生了。
AOP旨在将横切关注点与业务主体进行分类,从而提高程序代码的模块化程度。横切关注点是一个抽象的概念,它是指那些在项目中贯穿多个模块的业务。上个例子中日志功能就是一个典型的横切关注点。
AOP的几种实现方式:
- 动态代理(运行期通过接口直接生成代理对象)
- APT(编译期注解处理技术)
- AspectJ(一种编译器,它在Java编译器的基础上增加了关键字识别和编译方法)
- Transform + Javassist/ASM(Transform是Android Gradle提供的,可以操作字节码的一种方式。)
我们可以用来实现什么功能?
利用AOP可以做一些很有意思的事情。一些知名的开源框架,他们都采用了AOP的思想。例如:ButterKnife、Retrofit、Hugo等。另外,AOP在性能检测和埋点技术上出现了百家争鸣的局面。
性能检测与优化。360的ArgusAPM、滴滴的booster、Jake Wharton大神的Hugo。
埋点技术。罗辑思维的DDAutoTracker、神策数据的Sensors Analytics、网易的HubbleData等。
除此之外,借助AOP我们还可以实现以下功能:
通常我们在向服务器请求数据时,会显示一个Loding,等到结果返回后再隐藏它。我们可以通过AOP技术把显示、隐藏Loding的动作和业务主体分离开。
权限管理。推荐一个开源库Aopermission,用AspectJ解决了权限问题。
什么是Hook?
在事件执行的过程中截获并监控事件的执行流,将自身的代码融入其执行流中
热修复原理
-
什么是热修复?
说的清新脱俗一点,就是线上实时修复bug
-
为什么要有热修复呢?(优点)
降低了成本,用户体验也好,不用像原来修复bug(哪怕就是一行代码)还得重新打包再发送新版本到应用市场,再让用户下载,那样成本高不说,用户体验还特别不好,所以就出现了热修复。
-
热修复的原理?
热修复主要是通过android的类加载机制来实现的。
Android中有两个类加载器PathClassLoader和DexClassLoader,准确的来说应该是有三个,还有一个BaseDexClassLoader,BaseDexClassLoader是上面这两个类加载器的父类,在BaseDexClassLoader里面有一个重要的属性DexPathList,DexPathList在BaseDexClassLoader的构造函数中被创建出来,DexPathList里面有两个构造函数SplitDexPath()(将dexPath目录下的所有文件转成一个File集合)和makeDexElments()(将File集合转为Elment数组), 在这个BaseDexClassLoader里面还有一个特别重要的方法,这也是它的核心方法。findClass()从Elemet数组中拿出一个个dex文件,在从dex文件中搜索class,正因为这个特性,我们只需要将Element数组与App原Element数组合并,得到一个新的Element数组,要注意摆放的先后顺序,然后将这个新的Element数组用反射的方式赋值给App当前类加载器的pathList中的Elements数组,因为pathList的 findClass()是采用遍历方式一个个从Element中找class,而修复好的class所在的Element排在有Bug的class的Element的前面,所以,当App再次从类加载器中拿Class时就只会拿到前面的Class,也就是Bug已经修复好的class。这就是热修复的原理。
Android 进程通讯数据为什么要实现序列化?
Android不同的进程都有自己独立的内存空间,且相互之间不能进行访问。如果像我们平常传一个句柄的方式去传值的话肯定是失败的,因为句柄也是指定内存空间的一个区域。现在进程无法访问目标进程的内存空间,所以句柄传过去也是没有用的。 所以我们必须将要传输的数据转换成能够在内存空间流通的形式。这个转化过程就叫做序列化和反序列化。 简单来说是这样的:比如现在我们要将一个对象的数据从客户端传到服务端去,我们就可以在客户端对这个对象进行序列化的操作,将其中包含的数据转化为序列化流,然后将这个序列化流传输到服务端的内存中去,再在服务端对这个数据流进行反序列化的操作,从而还原其中包含的数据。 Android中对数据序列化有两种方法:一种是实现Serializable接口另一种是实现Parcelable接口。
Android中数据序列化之Serializable与Parcelable
UML各种图总结-精华
Java静态代理和动态代理理解
Java链表
- 什么是链表?
- 链表的特点是什么?
- 链表的实现原理?
- 如何自己写出一个链表?