如何制作网站和网页,校园网站建设的必要性论文,wordpress主题sora,免费素材图库下载类列表 每一个ClassLoader里面的类列表#xff0c;类的数量都是固定的。
对上一节中的dex反编译 使用DexClassLoader类动态加载插件dex 利用jadx对dex进行反编译可以看到有哪些类 源码分析 BaseDexClassLoader 从BaseDexClassLoader类加载器开始分析 在BaseDexClassLoade…类列表 每一个ClassLoader里面的类列表类的数量都是固定的。
对上一节中的dex反编译 使用DexClassLoader类动态加载插件dex 利用jadx对dex进行反编译可以看到有哪些类 源码分析 BaseDexClassLoader 从BaseDexClassLoader类加载器开始分析 在BaseDexClassLoader类里有一个pathList属性它的类型是DexPathList分析DexPathList类的定义 DexPathList 在DexPathList类里有一个dexElements属性它是Element类型分析Element类的定义 Element Element类是DexPathList的内部类它有一个属性是dexFile它是DexFile类型分析DexFile类的定义 DexFile 在DexFile里找到一个方法getClassNameList()获取类名它需要一个参数cookie cookie参数就是DexFile类的属性mCookie了 接下来通过反射调用getClassNameList()方法就可以得到类加载器可以加载的类了。
代码
public static void getClassListInClassLoader(ClassLoader classLoader) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {// 获取BaseDexClassLoader类Class BaseDexClassLoaderClassClass.forName(dalvik.system.BaseDexClassLoader);// 获取BaseDexClassLoader类中的pathList字段Field pathListField BaseDexClassLoaderClass.getDeclaredField(pathList);// 设置权限pathListField.setAccessible(true);// 从传进去的参数classLoader加载器对象中获取pathList对象Object pathListobj pathListField.get(classLoader);// 获取DexElemtnt类Class DexElemtntClass Class.forName(dalvik.system.DexPathList);// 获取DexElemtnt类中的dexElements字段Field dexElements DexElemtntClass.getDeclaredField(dexElements);// 设置权限dexElements.setAccessible(true);// pathList对象中获取dexElements对象Object[] dexElementsArratobj (Object[]) dexElements.get(pathListobj);// 获取Element内部类Class ElementClass Class.forName(dalvik.system.DexPathList$Element);// 从Element内部类中获取字段dexFileField dexFileField ElementClass.getDeclaredField(dexFile);设置权限dexFileField.setAccessible(true); // 取消权限检查// 获取DexFile类Class DexFileClass Class.forName(dalvik.system.DexFile);// 从DexFile类中获取字段mCookie Field mCookieField DexFileClass.getDeclaredField(mCookie);// 设置权限mCookieField.setAccessible(true);// 获取字段mFileNameField mFIleNameField DexFileClass.getDeclaredField(mFileName);// 设置权限mFIleNameField.setAccessible(true);// 从DexFile类中获取getClassNameList方法Method getClassNameListMethod DexFileClass.getDeclaredMethod(getClassNameList,Object.class);// 设置权限getClassNameListMethod.setAccessible(true);// 遍历dexElementsdexElement里面有dexFilefor(Object dexElementobj:dexElementsArratobj){// 获取dexfile对象Object dexfileObj dexFileField.get(dexElementobj);// 获取mCookie对象Object mCookieobj mCookieField.get(dexfileObj);// 获取mFileName对象String mFileNameobj (String) mFIleNameField.get(dexfileObj);// 调用getClassNameList方法获取类列表String[] classList (String[]) getClassNameListMethod.invoke(null,mCookieobj);for(String classname:classList){// 打印信息Log.e(classlist,classLoader.toString()---mFileNameobj---classname);}}
}调用getClassListInClassLoader()
getClassListInClassLoader(dexClassLoader) 成功获取到了dexClassLoader类加载器中可以加载的类