9

一般问题: 是否可以使用 ClassLoader 替换预加载的(由系统,例如在 Android 的%android%/frameworks/base/preloaded-classes文件中找到)类?

具体: 在我的应用程序中创建 WebView 之前,我正在尝试使用 DexClassLoader 替换在 android.net.* 中找到的类。我可以得到一个 Class 对象,但是 getMethods() 例如给了我一个我期望在未修改/原始类实现中的数组。这是由于预加载类系统造成的吗?

基本设置和伪代码:

  1. 修改 android.net.* 类,添加一些测试方法/等。
  2. 编译并以 classes.dex 结束
  3. jar cf mytest.jar classes.dex
  4. 在 APK 资产中包含 mytest.jar
  5. 创建 DexClassLoader 并通过 loadClass() 获取 Class
  6. Class 对象上的 getMethods() 返回一个数组,我希望看到 #1 中没有修改

如果需要,我可以提供有关我正在使用的设置和代码的更多详细信息。

4

1 回答 1

8

你不能。WebView 是引导类路径的一部分,因此是基类加载器。没有什么可以让它使用另一个类加载器中的类。事实上,在你的应用程序启动之前,它已经被加载并链接到它使用的类(作为 zygote 进程预初始化的一部分)。

于 2011-08-17T07:45:17.877 回答