Bootstrap Classloader加载的类

San*_*osh 5 java classloader

这个帖子引起了这个问题。当运行如下所示的简单程序时

public class Sample
{
    public static void main(String[] args)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

带有options -versbose:class,它在加载该类之前列出了一堆类

[Opened C:\jdk1.6.0_14\jre\lib\rt.jar]
[Loaded java.lang.Object from C:\jdk1.6.0_14\jre\lib\rt.jar]
[Loaded java.io.Serializable from C:\jdk1.6.0_14\jre\lib\rt.jar]
[Loaded java.lang.Comparable from C:\jdk1.6.0_14\jre\lib\rt.jar]
.
.
.
.
.
.
[Loaded java.security.cert.Certificate from C:\jdk1.6.0_14\jre\lib\rt.jar]
[Loaded Sample from file:/D:/tmp/]
[Loaded java.lang.Shutdown from C:\jdk1.6.0_14\jre\lib\rt.jar]
[Loaded java.lang.Shutdown$Lock from C:\jdk1.6.0_14\jre\lib\rt.jar]
Run Code Online (Sandbox Code Playgroud)

我的问题是

我的计划从来不需要象类java.util.CollectionSet List等等。那么为什么Bootstrap类加载器正在加载它们。这是JVM规范要求的方式还是Bootstrap类加载器如何确定要加载的类?

编辑:

另一个方面:

即使您尝试运行不存在的类,该程序也会以ClassNotFoundException但并非没有加载前面提到的所有类结束。因此,仅在调用JVM时加载类!因此,JVM默认情况下会加载一组类,但是,什么决定了这种行为呢?

Nar*_*hai 4

Class是包的一部分java.lang,因此引导类加载器会选择它来加载,但Class它本身需要一些依赖的框架类,例如ListSet,因此它们也会被加载。

如果您在 JDK 中看到代码,Class您会发现以下导入

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.LinkedList;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.Map;
import java.util.HashMap;
Run Code Online (Sandbox Code Playgroud)

Classsource 内部使用了Collections,所以需要加载。