众所周知,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。我还测试了同时使用PathClassLoader
和BootClassLoader
加载特定于应用程序的类,只有PathClassLoader
可以成功加载它们。