Отличаются ли загрузчики классов Android от Oracle? - PullRequest
0 голосов
/ 19 февраля 2019

Как мы знаем, у нас обычно есть три вида загрузчиков классов в Java: Bootstrap, Extension, System.Но я думаю, что это не так для Android.

Из документации Google :

Обычно это делает то, что вы хотите.Вы можете столкнуться с проблемами, если создадите поток самостоятельно (возможно, вызвав pthread_create, а затем прикрепив его с помощью AttachCurrentThread).Теперь нет стековых фреймов из вашего приложения.Если вы вызовете FindClass из этого потока, JavaVM запустится в загрузчике классов " system " вместо того, который связан с вашим приложением , поэтому попытается найти специфичное для приложения классы не пройдут.

Я выделил некоторые ключевые слова здесь.Как вы можете видеть, они упомянули SYSTEM CLASS LOADER, а также говорят, что системный загрузчик классов не загружает классы, специфичные для приложения.Это смущает меня.В типичной JVM загрузчик системных классов, который также называется загрузчиком классов приложений, загружает собственные или сторонние классы приложения.Но в приведенном выше описании говорится что-то другое.

Итак, я запустил некоторый простой тестовый код, подобный приведенному ниже:

System.out.println(java.util.ArrayList.class.getClassLoader());
System.out.println(com.myapp.MyApp.class.getClassLoader());

В Eclipse, как и следовало ожидать, первая строка выдает " null ",

, а второй печатает" sun.misc.Launcher$AppClassLoader@xxxxxxxx ".

Но когда я запускаю этот код на моем Android 8.0Устройство возвращает «java.lang.BootClassLoader@xxxxxxx»

, а второе возвращает « dalvik.system.PathClassLoader [DexPathList [[zip-файл» / data / app/com.example.myproject-fws-bX_CTH09QygC3XTUeA==/base.apk"],nativeLibraryDirectories=[/data/app/com.examp....."'.

Я побежал сновасо строками ниже внутри onCreate() метода на устройстве Android:

java.util.ArrayList.class.getClassLoader().getParent();
com.myapp.MyApp.class.getClassLoader().getParent();
com.myapp.MyApp.class.getClassLoader().getParent().getParent();
this.getClass().getClassLoader();  // this is the same as just calling getClassLoader().
this.getClass().getClassLoader().getParent();
this.getClass().getClassLoader().getParent().getParent();

На этот раз первый возвращает " null ",

second "java.lang.BootClassLoader@xxxxxxx ",

третий" null",

четвертый ' dalvik.system.PathClassLoader [DexPathList [[ZIP-файл "/data/app/com.example.myproject-fws-bX_CTH09QygC3XTUeA==/base.apk"],nativeLibraryDirectories=[/data/app/com.examp....."',

пятый "java.lang.BootClassLoader@xxxxxxx",

шестой " null " соответственно.

I'mне уверен, что все это значит, но все равно по-другому.

Кто-нибудь знает о загрузчиках классов Android, или не могли бы вы дать мне ссылку, связанную с этим?

PS.Я также протестировал загрузку классов, специфичных для своего приложения, с PathClassLoader и BootClassLoader, и только PathClassLoader мог успешно их загрузить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...