当前位置: 首页 > 知识库问答 >
问题:

谁首先创建Class对象在类加载过程中?

梁浩涆
2023-03-14

在我找到的文档中:

类对象由Java虚拟机在加载类时自动构造,并通过调用类加载器中的defineClass方法来构造。

我检查了源代码,但没有找到要调用的位置defineClass,例如从loadClass方法。请告诉我,根据此方案,谁和何时调用defineClass方法:

图像源

共有3个答案

邵修诚
2023-03-14
class NetworkClassLoader extends ClassLoader {
         String host;
         int port;

         public Class findClass(String name) {
             byte[] b = loadClassData(name);
             return defineClass(name, b, 0, b.length);
         }

         private byte[] loadClassData(String name) {
             // load the class data from the connection
              . . .
         }
     }
颜嘉福
2023-03-14

java。lang.ClassLoader是一个非常大的类。使用GrepCode链接(适用于Java6-b14版本),您可以在第267行找到publicloadClass方法。

此方法在第308行调用受保护的loadClass方法,此方法尝试使用以下方法加载以前加载的类:

  • findLoadedClass最终调用本机方法,

这很重要,因为请记住,ClassLoader试图重用已经加载的类。

但是,defineClass在哪里调用?这个抽象类中没有位置,但是如果您使用GrepCode中的引用工具并搜索它的使用位置defineClass(参见这里的结果),您将发现许多具体的类,它们最终调用defineClass

这并不简单,其中一些类重写defineClass,而另一些类调用自己的loadClass,然后调用。。。依此类推,但最后它调用defineClass

不要忘记ClassLoaderdefineClass以三种本机方法之一结束,这三种方法是JVM魔力的源泉:defineClass0defineClass1和/或defineClass2

本机函数定义Class0调用Java_java_lang_ClassLoader_defineClass0fromClassLoader. c和相同的1和2个函数

此函数使用JVM中定义的JVM\u DefineClassWithSource创建所需的类。h并在openjdk\hotspot\src\share\vm\prims\jvm中实现。cpp

最后一个文件定义了jvm\u define\u class\u common函数,它最终是创建所需类的函数。最后,此函数调用JNIHandles::make_local来分配类。您可以在openjdk\hospot\src\share\vm\runtime\jniHandles中看到最后一个函数的代码。cpp

希望它能回答你的问题。

傅涵忍
2023-03-14

调用ClassLoader#loadClass()时调用defineClass()方法。但是,这不是直接在java中完成的。lang.ClassLoader类,但位于其子类之一,例如在URLClassLoader\findClass()中。

调用ClassLoader#defineClass()最终会调用一个本机方法defineClass1()defineClass2()。这些方法的C实现可以在OpenJDK的src/share/native/java/lang/ClassLoader中找到。c

 类似资料:
  • 本文向大家介绍Java 对象的创建过程?相关面试题,主要包含被问及Java 对象的创建过程?时的应答技巧和注意事项,需要的朋友参考一下 下图便是 Java 对象的创建过程,我建议最好是能默写出来,并且要掌握每一步在做什么。 Step1:类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始

  • 代码 我正在使用Eclipse Link和Glassfish,但我遇到了一个非常恼人的错误。 我正在持久化对象 我正在读取对象列表(包括新对象) 新对象的“items”不包含任何项 然后重新启动服务器: 我搜索了两天,更改了实体中的每个配置和注释。 我不知所措,提前谢谢你的帮助!

  • Objects类提供适用于所有对象的辅助函数,例如equals,hashCode等。 Class 声明 (Class Declaration) 以下是com.google.common.base.Objects类的声明 - @GwtCompatible public final class Objects extends Object Class Methods Sr.No 方法和描述 1

  • 本文向大家介绍如何在Python中创建类对象?,包括了如何在Python中创建类对象?的使用技巧和注意事项,需要的朋友参考一下 使用该类的构造函数创建一个类对象。然后将该对象称为类的实例。类实例化使用函数表示法。  在下面的代码中,我们定义一个类并创建了相同类的实例,如下所示

  • 我正在使用Arquillian、JBoss、JPA/Hibernate、H2 DB和Maven运行测试。在我的测试persistence.xml文件中,我有: 目前,我有一个User类通过Hibernate注释映射到“users”表。 一切都快开始了。问题是Hibernate正在尝试执行: 但是模式“my_schema”不存在,所以它失败了(毕竟我是在运行内存中的数据库)。 我如何进入Hibern