https://github.com/tiann/understand-plugin-framework
采用反射的技术,获取到能Hook住的点,将Hook主的代码的实现替换成自己的实现。例如在
ManagLog类中有一个bOpenSaveLogToFile的静态参数负责控制打印的日志是否存到本地,反复的将日志保存到本地会有频繁的读写导致内存溢出。这是一个第三方Jar包中的方法,想要修改这个参数只能通过反射的方式替换该参数的值
//禁止ManageLog的读写
Class clazz = Class.forName("com.butel.connectevent.base.ManageLog");
Object manageLog = clazz.newInstance();
Field openSaveLogToFile = clazz.getDeclaredField("bOpenSaveLogToFile");
openSaveLogToFile.setAccessible(true);
//替换ManageLog对象的bOpenSaveLogToFile参数的值
openSaveLogToFile.set(manageLog, false);
//禁止LogUtils的读写
Class clazzLog = Class.forName("com.butel.connectevent.utils.LogUtil");
Object logUtilObj = clazz.newInstance();
//拿到LogUtil的FileService参数
Field logField = clazzLog.getDeclaredField("fileService");
//修改私有属性先设置accessible
logField.setAccessible(true);
//获取原声的FileService方法
Object nativeFileService = logField.get(null);
//替换成我们代理的方法
FileService proxyFileService = new ProxyHYFileService((FileService) nativeFileService);
logField.set(logUtilObj, proxyFileService);
Log.d("Proxy", "proxy type : " + logField.get(logUtilObj));