https://github.com/tiann/understand-plugin-framework
采用反射的技術(shù)师妙,獲取到能Hook住的點(diǎn),將Hook主的代碼的實(shí)現(xiàn)替換成自己的實(shí)現(xiàn)稻薇。例如在
ManagLog類中有一個(gè)bOpenSaveLogToFile的靜態(tài)參數(shù)負(fù)責(zé)控制打印的日志是否存到本地轴合,反復(fù)的將日志保存到本地會(huì)有頻繁的讀寫導(dǎo)致內(nèi)存溢出伊脓。這是一個(gè)第三方Jar包中的方法晓殊,想要修改這個(gè)參數(shù)只能通過(guò)反射的方式替換該參數(shù)的值
image.png
image.png
//禁止ManageLog的讀寫
Class clazz = Class.forName("com.butel.connectevent.base.ManageLog");
Object manageLog = clazz.newInstance();
Field openSaveLogToFile = clazz.getDeclaredField("bOpenSaveLogToFile");
openSaveLogToFile.setAccessible(true);
//替換ManageLog對(duì)象的bOpenSaveLogToFile參數(shù)的值
openSaveLogToFile.set(manageLog, false);
//禁止LogUtils的讀寫
Class clazzLog = Class.forName("com.butel.connectevent.utils.LogUtil");
Object logUtilObj = clazz.newInstance();
//拿到LogUtil的FileService參數(shù)
Field logField = clazzLog.getDeclaredField("fileService");
//修改私有屬性先設(shè)置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));