Android的类加载器是否与Oracle的不同?

时间:2019-02-19 06:49:40

标签: java android jvm classloader

众所周知,Java中通常有三种类加载器:Bootstrap,Extension,System。 但是我认为Android并非如此。

来自Google的documentation

  

这通常可以满足您的需求。如果您遇到麻烦   自己创建一个线程(也许通过调用pthread_create,然后   使用AttachCurrentThread附加它)。现在没有堆栈框架   从您的应用程序。如果您从此线程调用FindClass,则   JavaVM将在“ 系统”类加载器中启动,而不是从一个   与您的应用相关联,因此尝试查找特定于应用的   课程将失败。

我在这里加粗了一些关键字。如您所见,他们提到了SYSTEM CLASS LOADER,并且还说系统类加载器不会加载特定于应用程序的类。 这使我感到困惑。对于典型的JVM,系统类加载器(也称为应用程序类加载器)加载应用程序自己的或第三方类。 但是上面的描述却有所不同。

所以我运行了一些简单的测试代码,如下所示:

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

正如您所料,在月食中,第一行显示“ ”,

第二个打印“ 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 .....“ '。

我在Android设备上的onCreate()方法内再次运行以下行:

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 ”,

第二个“ java.lang.BootClassLoader@xxxxxxx ”,

第三个“ ”,

第四个' dalvik.system.PathClassLoader [DexPathList [[zip文件“ /data/app/com.example.myproject-fws-bX_CTH09QygC3XTUeA==/base.apk"],nativeLibraryDirectories=[/data/ app / com.examp .....“ ',

第五个“ java.lang.BootClassLoader@xxxxxxx ”,

分别

第六个“ ”。

我不确定这到底是什么意思,但是还是有所不同。

有人知道Android的类加载器吗,或者您能给我任何与此相关的链接吗?

PS。我还测试了同时使用PathClassLoaderBootClassLoader加载特定于应用程序的类,只有PathClassLoader可以成功加载它们。

0 个答案:

没有答案