Java 是安卓';s类装入器与Oracle不同';s

Java 是安卓';s类装入器与Oracle不同';s,java,android,jvm,classloader,Java,Android,Jvm,Classloader,众所周知,Java中通常有三种类装入器:引导、扩展和系统。 但我认为Android并非如此 来自谷歌的: 这通常是你想要的。如果你不小心,你会惹上麻烦的 自己创建一个线程(可能通过调用pthread_create然后 使用AttachCurrentThread连接它)。现在没有堆栈帧 从你的申请中。如果从该线程调用FindClass,则 JavaVM将在“系统”类装入器中启动,而不是在 与您的应用程序关联,因此尝试查找特定于应用程序的 课程将会失败 我在这里加粗了一些关键词。如您所见,他们提到了

众所周知,Java中通常有三种类装入器:引导、扩展和系统。 但我认为Android并非如此

来自谷歌的:

这通常是你想要的。如果你不小心,你会惹上麻烦的 自己创建一个线程(可能通过调用pthread_create然后 使用AttachCurrentThread连接它)。现在没有堆栈帧 从你的申请中。如果从该线程调用FindClass,则 JavaVM将在“系统”类装入器中启动,而不是在 与您的应用程序关联,因此尝试查找特定于应用程序的 课程将会失败

我在这里加粗了一些关键词。如您所见,他们提到了系统类加载器,还说系统类加载器不加载特定于应用程序的类。 这使我困惑。对于典型的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_cth09qygc3xturea===/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

第三个“null

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

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

第六个“null”分别为

我不确定这一切到底意味着什么,但无论如何都是不同的

有人知道Android的类加载器吗,或者你能给我一些与此相关的链接吗


另外,我还测试了用
PathClassLoader
BootClassLoader
加载我的应用程序特定类,只有
PathClassLoader
才能成功加载它们。

是的,它们是不同的。Android有一个完全独立的Java实现。