你的类路径(`classpath`)中没有 `java/lang` 或 `java.base` 这样的路径,那这些核心类(比如 `String`、`System`、`Object`)是从哪里来的?

你观察到了一个细节:你的类路径(classpath)中没有 java/langjava.base 这样的路径,那这些核心类(比如 StringSystemObject)是从哪里来的?


✅ 简短回答:

是的,这些基础类是 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(旧式)

🟢 2. Platform ClassLoader(Java 9+ 新增)

  • 加载 JDK 的标准库模块,比如:

    • java.sqljava.xml
  • 也不在你手动指定的 classpath

🟡 3. Application ClassLoader(系统类加载器)

  • 加载你自己写的类、Maven 依赖、classpath 中的 .class.jar
  • 这是你通过 -classpath-cp 指定的那些路径
  • 你通常能看到的 classpath 就是它管理的内容

🧪 举个例子说明

你运行这段代码:

System.out.println("Hello");

虽然你什么也没导入,但它使用了:

  • java.lang.String
  • java.lang.System
  • java.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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值