ClassLoader, чтобы заменить предварительно загруженный класс? - PullRequest
9 голосов
/ 08 июля 2011

Общий вопрос: Можно ли использовать ClassLoader для замены предварительно загруженного (системой, например, найденного в Android % android% / frameworks / base / preloaded-classes file) класса?

Конкретные: Я пытаюсь использовать DexClassLoader для замены класса, найденного в android.net. * Перед созданием WebView в моем приложении. Я могу получить объект Class, но getMethods (), например, дает мне массив, который я ожидаю в неизмененной / оригинальной реализации класса. Это связано с системой предустановленных классов?

Базовая настройка и псевдокод:

  1. Изменить класс android.net. *, Добавив несколько методов тестирования / и т. Д.
  2. Скомпилируйте и в итоге получите классы.dex
  3. jar cf mytest.jar classes.dex
  4. Включить mytest.jar в активы APK
  5. Создать DexClassLoader и получить класс с помощью loadClass ()
  6. getMethods () для объекта Class возвращает массив, который я ожидаю увидеть без изменений, присутствующих в # 1

Я могу предоставить более подробную информацию о настройке, которую я использую, и при необходимости написать код.

1 Ответ

8 голосов
/ 17 августа 2011

Нет, вы не можете. WebView является частью пути загрузочного класса и, следовательно, загрузчиком базового класса. Вы ничего не можете сделать, чтобы заставить его использовать классы в другом загрузчике классов. Фактически, он уже был загружен и связан с классами, которые он использует еще до того, как ваше приложение запущено (как часть предварительной инициализации процесса zygote).

...