При чтении объекта из посылки в Android, когда мы не хотим использовать ClassLoader по умолчанию?

При реализации интерфейса Parcelable реализация CREATOR обычно использует конструктор, который принимает Parcel, например.

public Foo(Parcel parcel)

В этой посылке у нас может быть такой код

mMyField = посылка.readParcelable(MyFoo.class.getClassLoader())

Насколько я могу судить, обычно можно просто использовать загрузчик классов по умолчанию и вместо этого передать значение null, поскольку в файле package.writeParcelable(mMyField) уже хранится имя класса в пакете.

Итак, мой вопрос: когда мне нужно использовать MyFoo.class.getClassLoader() вместо передачи null?


person Charles Ma    schedule 12.09.2013    source источник


Ответы (1)


Поскольку Parcel хранит информацию о своем классе, но не о самом классе, этот класс будет загружен из имени, например java/util/ArrayList. Если ваш класс отсутствует в пути к классам или файл .class находится на удаленном сервере, даже вам потребуется использовать другой загрузчик классов, который может получить к нему доступ, например URLClassLoader.

person nanofarad    schedule 12.09.2013
comment
Мне удалось передать случайный загрузчик классов из несвязанного класса (например, String.class.getClassLoader()), и readFromParcelable все еще работает. Возвращает ли Foo.class.getClassLoader() один и тот же загрузчик классов по умолчанию для каждого класса? - person Charles Ma; 13.09.2013
comment
@CharlesMa Нет, он получает загрузчик классов, который загрузил этот класс. Строка только что была загружена загрузчиком классов по умолчанию (как и большинство в java.lang), поэтому, если вы загружаете FooClass из загрузчика классов, который не может загрузить все нужные вам классы, загрузка завершится ошибкой. - person nanofarad; 13.09.2013
comment
Ок, имеет смысл. Я думаю, что загрузчик классов по умолчанию работает для моих целей. Спасибо - person Charles Ma; 13.09.2013