数组类由JVM在运行时动态创建,不经过类加载器流程;其生成依赖已加载的元素类型,基本类型数组关联启动类加载器,引用类型数组归属元素类型的类加载器,类名如[Ljava/lang/String;严格遵循JVM规范。

数组类在 JVM 中不走常规类加载流程,而是由虚拟机在运行时直接构造,但它的生成逻辑高度依赖元素类型的加载状态。
数组类不是被“加载”出来的,而是被“动态创建”的
普通类(如 java.lang.String)需要通过类加载器读取字节码、验证、准备、解析、初始化等完整流程。而数组类(如 [Ljava.lang.String;)本身没有对应的 .class 文件,也不经过 findClass() 或 defineClass() 流程。JVM 在首次遇到该数组类型(例如执行 new String[10])时,会根据当前已加载的元素类型,在内存中即时生成一个数组类结构。
- 这个过程不触发类加载器的 loadClass() 方法
- JVM 内部调用类似 ClassLoader.defineArrayClass() 的原生逻辑(具体方法名因 JVM 实现而异)
- 生成的数组类对象仍是 java.lang.Class 的实例,可反射、可 instanceof 判断
元素类型决定数组类的归属与可见性
数组类虽不由类加载器创建,但其“身份”完全绑定于元素类型:
- 若元素类型是引用类型(如 String、MyBean),JVM 会确保该类型已被对应类加载器加载完成;数组类随后被注册到**同一类加载器的命名空间**中
- 若元素类型是基本类型(如 int、boolean),数组类直接关联到**启动类加载器(Bootstrap ClassLoader)**,且默认为 public 访问级别
- 数组类的可访问性继承自元素类型:String 是 public,那么 [Ljava.lang.String; 也是 public;若元素类型是包私有,则数组类同样不可被外部包访问
符号表示 [Ljava.lang.String; 的含义与生成依据
这类内部名称不是随意拼接的,而是 JVM 规范定义的二进制类名格式:
立即学习“Java免费学习笔记(深入)”;
- [ 表示一维数组
- L 表示“类引用类型”(L 开头,后跟全限定名,以 ; 结尾)
- Ljava.lang.String; 就是 String 类的规范内部名
- 合起来 [Ljava.lang.String; 明确告诉 JVM:“这是一个元素类型为 String 的一维对象数组”
- JVM 正是依据这个字符串中的元素类型标识(java.lang.String),去查找已加载的 Class 对象,并以此为基础构建数组类元数据
为什么不能跳过元素类型的加载?
因为数组类的运行时行为强依赖元素类型信息:
- 数组的 newInstance() 方法需知道元素类型的大小与构造方式
- 反射获取 getComponentType() 返回的就是元素类型的 Class 对象
- 类型检查(如赋值兼容性、cast 操作)必须能追溯到元素类型的继承关系
- GC 需识别数组内每个元素是否为引用,从而决定是否跟踪其可达性 —— 这依赖元素类型是否为引用类型



















