上一篇我们说了Binder机制,通过aidl的demo和系统源码的对比进行了运行过程的分析,这一篇我们说代理模式及反射,之前说过了,只是为了梳理插件化需要了解的知识点,所以不会特别深的去讲解。
代理模式:
也叫做委托模式,分为静态代理和动态代理。代理模式也是平时比较常用的设计模式之一,代理模式有代码简洁,高扩展性的特性.主要目的就是为访问者提供一个代理,以达到限制某个对象的访问,也就是说想访问一个对象,其实我给你的是一个代理,不让你直接使用我。估计不理解的人会问为什么使用代理模式,他限制了对象的访问,也就是说不能通过new的方式得到你想要的对象,只能通过访问代理类才能使用,这样的话,我们就实现了内部对象的保护,而且如果有一天我的真实角色因为某个原因换了个名或者换了个方法字段等等,那对外来说一点不影响,因为他拿到的只是代理而已
静态代理,还记的我们上一篇分析的aidl吗,他其实就是一个典型静态代理,我们再看一下代码
public static com.huanju.chajianhuatest.IMyAidlInterface asInterface(android.os.IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin != null) && (iin instanceof com.huanju.chajianhuatest.IMyAidlInterface))) {
return ((com.huanju.chajianhuatest.IMyAidlInterface) iin);
}
return new com.huanju.chajianhuatest.IMyAidlInterface.Stub.Proxy(obj);
}
如果不是一个进程就返回了一个Stub.Proxy的代理类,如果客户端访问方法的时候,会调用服务端的方法然后将结果返回给客户端,这就是一个代理模式,而且android中的所有系统服务全部使用的这种模式。
动态代理,就是在实现阶段不需要制定代理谁,在运行的时候指定一个代理类,这样就更灵活了,主要实现通过Java提供的InvocationHanler类,
1.写一个类实现InvocationHanlder接口
2.重写接口的invoke方法
3.通过调用Proxy.newProxyInstance(ClassLoader loader, Class[] claz , InvocationHanlder handler)返回一个代理对象;
这里先不给出demo,等说完反射,我们一起实现一个hook系统类的demo,将会用到动态代理及反射
Hook机制
hook,又叫钩子,通常是指对一些方法进行拦截。这样当这些方法被调用时,也能够执行我们自己的代码,这也是面向切面编程的思想(AOP)
android中,本身并不提供这样的拦截机制,但是有时候,我们可以在一些特殊的场合实现一种的Hook方法。
大致思路:
1.找到需要Hook方法的系统类
2.利用代理模式来代理系统类的运行拦截我们需要拦截的方法
3.使用反射的方法把这个系统类替换成你的代理类
反射机制:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
在android中Google很多的类的某些方法不让第三方应用去调用,通过java反射机制能把这些隐藏方法获取出来并调用
相关API:
1.实例化Class对象,有三种方式,
Class.forName(类名全路径); //通过Class的静态方法
对象.getClass() //通过对象.getClass方法
int.class //基本数据类型及基本数据类型的封装了,例如Integer
2.获取父类
Class<?> clazz = Class.forName(类名全路径); //通过Class的静态方法
Class<?> superclass = clazz.getSuperclass();
3.获取实现接口
Class<?> clazz = Class.forName(类名全路径); //通过Class的静态方法
Class<?>[] interfaces = clazz.getInterfaces()
4.获取指定参数