其实关于为什么会产生热修复,热修复怎么用,这些网上一大篇博客,本篇博客的内容是 :手写一个Android热修复Demo
要手写Demo ,首先需要掌握 两点:反射和ClassLoader。关于ClassLoader,不了解的可以看下上篇博客 Android中的类加载器——ClassLoader。
反射知识,可以看下这个博客:Android 插件化开发——基础底层知识(反射), 这里直接贴出我们Demo 中需要用到的反射工具类:
/**
* FileName:SharedReflectUtils
* Create By:liumengqiang
* Description:TODO
*/
public class SharedReflectUtils {
/**
* 反射获取一个属性
*
* @param instance PathClasLoader
* @param name
* @return
*/
public static Field getField(Object instance, String name) throws NoSuchFieldException {
for (Class<?> cls = instance.getClass(); cls != null; cls = cls.getSuperclass()) {
try {
Field declaredField = cls.getDeclaredField(name);
//设置权限
declaredField.setAccessible(true);
return declaredField;
} catch (NoSuchFieldException e) {
}
}
throw new NoSuchFieldException("Field:" + name + " not found in " + instance.getClass());
}
/**
* 反射获取一个方法
*
* @param instance PathClasLoader
* @param name
* @return
*/
public static Method getMethod(Object instance, String name,Class<?>... parameterTypes) throws NoSuchMethodException {
for (Class<?> cls = instance.getClass(); cls != null; cls = cls.getSuperclass()) {
try {
Method declaredMethod = cls.getDeclaredMethod(name,parameterTypes);
//设置权限
declaredMethod.setAccessible(true);
return declaredMethod;
} catch (NoSuchMethodException e) {
}
}
throw new NoSuchMethodException("Method:" + name + " not found in " + instance.getClass());
}
}
这个工具类 的作用是:递归自己以及自己的父类查找方法或者属性,如果找到 就返回。