他们以为我疯了,其实我成了白日梦想家。

java 中的ClassLoader 用于动态加载java程序运行时所需要的资源:包括要装配进jvm的class字节码文件以及一些其他资源文件。

Java中的几种ClassLoader

BootStrapClassLoader

关于BootStrapClassLoader的作用

java里class是被java.lang.ClassLoader加载的,那么,问题是,谁来加载ClassLoader呢?

–>>There is where the bootstrap or primordial class loader comes into play.

BootStrapClassLoader 是其他CLassLoder的顶级parent,其实现是jvm的一部分,被编写在jvm本地代码中,并不以class的形式存在java里,因此它也会随着jvm的不同而不同。并且在java里面被代表为null

BootstrapCLassLoader负责加载:

java8以及之前:

  • jdk的核心类,比如 %JAVA_HOME%/jre/lib下的 rt.jar和其中的其他核心库。

java9模块化之后:

  • 这些核心类库以一种更加高效的方式存储在%JAVA_HOME%/lib下面(关于这个目录下一些文件的作用。。。)
  • BootstrapClassLoader加载的模块(一部分):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public void moduleClassLoader(){
ModuleLayer layer = ModuleLayer.boot();
layer.modules()
.stream()
.filter(m-> m.getClassLoader()==null)
.forEach(module -> {
ClassLoader classLoader = module.getClassLoader();
String classLoaderName = classLoader==null ? "bootstrap" : classLoader.getName();
System.out.println(classLoaderName + ": " + module.getName());
});
}
/*
sout>>
bootstrap: java.base
bootstrap: java.rmi
bootstrap: java.logging
bootstrap: java.security.sasl
bootstrap: jdk.nio.mapmode
bootstrap: java.prefs
bootstrap: java.instrument
bootstrap: java.xml
bootstrap: java.datatransfer
bootstrap: jdk.naming.rmi
bootstrap: jdk.sctp
bootstrap: jdk.jfr
bootstrap: jdk.management.jfr
bootstrap: java.desktop
bootstrap: jdk.unsupported
bootstrap: jdk.net
bootstrap: java.management.rmi
bootstrap: java.management
bootstrap: java.naming
bootstrap: jdk.management
bootstrap: jdk.management.agent
*/

PlatForm ClassLoader(Extension ClassLoader)

加载jdk 其他core类库,以供所有application使用

**java8及以前: **

  • 加载 %JAVA_HOME%/jre/lib/ext下的jar以及 java.ext.dirssystem propertry指定的目录下的jar

java9
PlatformClassLoader加载的模块(一部分):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
platform: java.xml.crypto
platform: jdk.jsobject
platform: jdk.crypto.ec
platform: jdk.httpserver
platform: jdk.security.jgss
platform: java.scripting
platform: jdk.localedata
platform: jdk.crypto.mscapi
platform: java.sql.rowset
platform: jdk.accessibility
platform: java.sql
platform: java.smartcardio
platform: jdk.charsets
platform: jdk.naming.dns
platform: jdk.crypto.cryptoki
platform: jdk.zipfs
platform: java.transaction.xa
platform: jdk.dynalink
platform: jdk.xml.dom
platform: jdk.security.auth
platform: java.compiler
platform: java.net.http
platform: java.security.jgss

SystemClassLoader

用于加载类路径以及模块路径上的应用级别的class。

java8及以前: 命令行的 : java [-classpath|-cp] /path/to/classes:/path/to/lib/* package.to.MainClass

java9以后还可以: java --module-path /path/to/modules -m mainModule/package/to/MainClass