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

rem*_*rab 6 java class classloader new-operator

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

我的问题是我们何时使用:

Test test = new Test();
Run Code Online (Sandbox Code Playgroud)

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

Kau*_*hal 5

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

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

  1. 调用findLoadedClass以查看是否已加载该类.
  2. 如果还没有加载类,则使用findClass获取字节(由类加载器实现覆盖).
  3. 如果找到原始字节,请调用defineClass将它们转换为Class对象.(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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

以下示例将打印相同的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());
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请 访问http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html?page=1