为什么Java中会自动加载类数组?

为什么Java中会自动加载类数组?,java,Java,我创建了一个java代理类,它只用于检索一个类数组,我在上面迭代并打印它们的全名 我使用此命令运行此代理: java-javaagent:-jar 包含我的代理类,只包含一个带有空main方法的类(因为我必须将someclass/jar传递给java命令) 因此,基本上,它打印了JVM加载的所有默认类,下面是一个类名片段,其中包含“String”和“Object”: (输出格式:Class.getName()-Class.getTypeName()) 为什么许多类都有数组项,例如Object和O

我创建了一个java代理类,它只用于检索一个类数组,我在上面迭代并打印它们的全名

我使用此命令运行此代理:

java-javaagent:-jar

包含我的代理类,
只包含一个带有空main方法的类(因为我必须将someclass/jar传递给
java
命令)

因此,基本上,它打印了JVM加载的所有默认类,下面是一个类名片段,其中包含“String”和“Object”:

(输出格式:Class.getName()-Class.getTypeName())


为什么许多类都有数组项,例如Object和Object[]?

必须加载它,因为Java中的每个类都是扩展的
对象
类,或者我们可以说Object是Java中每个类的超类

因此,当您打印出加载的类时,它将显示
对象

从Oracle文档:

java.lang包中的对象类位于 类层次结构树。每个阶级都是直接或间接的后代, 对象类的。您使用或编写的每个类都继承 对象的实例方法

发件人:

类装入器

在JVM中,每个类都由 java.lang.ClassLoader。类加载器类位于 java.lang包和开发人员可以自由地将其子类化以添加他们的 将自己的功能加载到类中

每当通过键入java MyMainClass启动新JVM时,“引导类加载器”负责加载关键java类 像java.lang.Object和其他运行时代码一样,先将它们放入内存。 运行时类打包在JRE\lib\rt.jar文件中。我们 在Java中找不到引导类加载程序的详细信息 文档,因为这是本机实现。同样 因此,引导类装入器的行为也会有所不同 跨JVM


必须加载它,因为Java中的每个类都是extensed
Object
class,或者我们可以说Object是Java中每个类的超类

因此,当您打印出加载的类时,它将显示
对象

从Oracle文档:

java.lang包中的对象类位于 类层次结构树。每个阶级都是直接或间接的后代, 对象类的。您使用或编写的每个类都继承 对象的实例方法

发件人:

类装入器

在JVM中,每个类都由 java.lang.ClassLoader。类加载器类位于 java.lang包和开发人员可以自由地将其子类化以添加他们的 将自己的功能加载到类中

每当通过键入java MyMainClass启动新JVM时,“引导类加载器”负责加载关键java类 像java.lang.Object和其他运行时代码一样,先将它们放入内存。 运行时类打包在JRE\lib\rt.jar文件中。我们 在Java中找不到引导类加载程序的详细信息 文档,因为这是本机实现。同样 因此,引导类装入器的行为也会有所不同 跨JVM

为什么许多类都有数组项,例如Object和Object[]

它只是应用程序和/或JVM的默认应用程序启动器代码引用的类

将加载
对象
类,因为其他类继承自该对象。当启动器使用反射来查找
main(String[])
方法的
Method
对象时,最有可能使用
Object[]
数组类型

当JVM自行引导时,会有一大堆“黑魔法”发生在场景后面。如果你真的需要知道,那么源代码是可用的

(代理的类和依赖项也可能显示在列表中,但它们也可能由不同的类加载器加载。)

为什么许多类都有数组项,例如Object和Object[]

它只是应用程序和/或JVM的默认应用程序启动器代码引用的类

将加载
对象
类,因为其他类继承自该对象。当启动器使用反射来查找
main(String[])
方法的
Method
对象时,最有可能使用
Object[]
数组类型

当JVM自行引导时,会有一大堆“黑魔法”发生在场景后面。如果你真的需要知道,那么源代码是可用的

(您的代理的类和依赖项也可能会显示在列表中,但它们也可能由不同的类加载器加载。)

如果您调用
main(String[]args)
您将需要
对象
(因为所有内容都扩展了
对象
)、
字符串[]
字符串

现在看看
String
的导入,您会发现一些:

import java.io.ObjectStreamField;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Formatter;
import java.util.Locale;
import java.util.Objects;
import java.util.StringJoiner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
类不会因为被导入而立即加载。但是,当您调用
main
方法时,JVM会先进行一些处理,例如解析参数并将其写入
args
数组。不难想象,您列出的一些类是需要的。

如果您调用
main(String[]args)
您将需要
Object
(因为一切都扩展了
Object
)、
String[]
String

现在看看
String
的导入,您会发现一些:

import java.io.ObjectStreamField;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Formatter;
import java.util.Locale;
import java.util.Objects;
import java.util.StringJoiner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
类不会因为被导入而立即加载。但是当您调用
main
方法时,JVM会执行一些processin