你观察到了一个细节:你的类路径(classpath)中没有 java/lang 或 java.base 这样的路径,那这些核心类(比如 String、System、Object)是从哪里来的?
✅ 简短回答:
是的,这些基础类是 JVM 自带的,不需要你自己设置,它们在一个特殊的地方叫做 “模块路径” 或 “引导类路径(bootstrap classpath)”,由 JVM 启动时自动加载。
🔍 JVM 类加载机制(ClassLoader 层级)
Java 中的类加载器有三层:
🔵 1. Bootstrap ClassLoader(引导类加载器)
-
加载
java.lang.*、java.util.*等核心类(JDK模块,如java.base) -
不是 Java 实现的,属于 JVM 内部(C/C++ 实现)
-
不在
classpath中出现! -
路径来自:
- Java 9+:
$JAVA_HOME/lib/modules(模块化) - Java 8-:
$JAVA_HOME/jre/lib/rt.jar(旧式)
- Java 9+:
🟢 2. Platform ClassLoader(Java 9+ 新增)
-
加载 JDK 的标准库模块,比如:
java.sql、java.xml
-
也不在你手动指定的
classpath中
🟡 3. Application ClassLoader(系统类加载器)
- 加载你自己写的类、Maven 依赖、classpath 中的
.class和.jar - 这是你通过
-classpath或-cp指定的那些路径 - 你通常能看到的 classpath 就是它管理的内容
🧪 举个例子说明
你运行这段代码:
System.out.println("Hello");
虽然你什么也没导入,但它使用了:
java.lang.Stringjava.lang.Systemjava.io.PrintStream
这些类都来自于 JDK 自带的模块(如 java.base),由 Bootstrap ClassLoader 加载。
你不需要在 classpath 中添加它们,JVM 启动时就自动加载了。
🔍 验证方式:看 String 类的加载器是谁
你可以用以下代码查看类加载器:
System.out.println(String.class.getClassLoader()); // null
输出:
null
说明 String 是由 引导类加载器(Bootstrap ClassLoader) 加载的。Java 中用 null 表示它。
✅ 总结
| 问题 | 说明 |
|---|---|
为什么 java.lang 没在 classpath 中? | 因为它是 JVM 自带的核心类,由 Bootstrap ClassLoader 加载 |
| 需要手动添加 JDK 类路径吗? | ❌ 不需要,JVM 启动时自动设置 |
| classpath 包含哪些类? | 只包含你的项目代码、依赖 jar、输出的 .class 文件 |
java.lang.* 属于哪个模块? | Java 9+ 是 java.base 模块,Java 8 是 rt.jar |

被折叠的 条评论
为什么被折叠?



