gpt4 book ai didi

java - 当我们使用new运算符创建一个对象时,它是否使用实际的.class文件在java中创建一个对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:12:11 26 4
gpt4 key购买 nike

我对某个主题感到困惑,无法在网上找到它。据我了解,当程序启动时,类加载器加载 .class 文件并将它们作为类型为 Class 的对象存储在内存中。

我的问题是当我们使用:

Test test = new Test();

新对象是使用.class文件创建的,还是使用内存中已有的Class对象创建的?

最佳答案

一旦一个类被加载到 JVM 中,同一个类将不会被同一个类加载器再次加载。新实例将从内存中的类对象创建(对于相同的类加载器)。

高级步骤(从 https://www.ibm.com/developerworks/java/tutorials/j-classloader/j-classloader.html 复制)

  1. 调用 findLoadedClass 以查看是否已加载该类。
  2. 如果尚未加载该类,则使用 findClass 获取字节(被类加载器实现覆盖)。
  3. 如果找到原始字节,调用 defineClass 将它们变成一个类对象。 (AppClassLoader 中的示例)
  4. 如果类已解析,则调用 resolveClass 来解析 Class 对象。
  5. 如果仍然没有类,则抛出 ClassNotFoundException。

    protected synchronized Class<?> loadClass(String name, boolean resolve)
    throws ClassNotFoundException
    {
    // First, check if the class has already been loaded
    Class c = findLoadedClass(name);
    if (c == null) {
    try {
    if (parent != null) {
    c = parent.loadClass(name, false);
    } else {
    c = findBootstrapClass0(name);
    }
    } catch (ClassNotFoundException e) {
    // If still not found, then invoke findClass in order
    // to find the class.
    c = findClass(name);
    }
    }
    if (resolve) {
    resolveClass(c);
    }
    return c;
    }

以下所有示例将打印相同的 hashCode 并引用相同的 Test.class

    Test  test1 = new Test();
Test test2 = new Test();
System.out.println(test2.getClass().hashCode());
System.out.println(test1.getClass().hashCode());
System.out.println(Test.class.hashCode());

更多详情 http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html?page=1

关于java - 当我们使用new运算符创建一个对象时,它是否使用实际的.class文件在java中创建一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48008163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com