首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在类加载过程中,谁最先创建了Class<?>对象?

在类加载过程中,谁最先创建了Class<?>对象?
EN

Stack Overflow用户
提问于 2015-12-04 00:01:17
回答 3查看 700关注 0票数 17

documentation中,我发现:

类对象是由Java Virtual Machine在加载类时自动构造的,并通过调用类加载器中的defineClass方法来实现。

我检查了the source code,但没有找到要调用的地方defineClass,例如从loadClass方法。您能告诉我,根据这个方案,谁在什么时候调用defineClass方法吗?

图片

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-06 17:14:46

在调用ClassLoader#loadClass()期间调用defineClass()方法。然而,这不是直接在java.lang.ClassLoader类中完成的,而是在它的一个子类中完成的,例如在URLClassLoader#findClass()中。

ClassLoader#defineClass()的调用以对本机方法defineClass1()defineClass2()之一的调用结束。这些方法的C实现可以在src/share/native/java/lang/ClassLoader.c的OpenJDK中找到。

票数 10
EN

Stack Overflow用户

发布于 2015-12-06 17:35:48

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

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

  • findLoadedClass最终调用本机方法,
  • 调用parent.loadClass,如果没有parent,则调用
  • ,如果找不到任何类,则调用findClass (也是本机方法)。

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

但是,在哪里调用defineClass呢?这个抽象类没有位置,但是如果你使用GrepCode的引用工具并搜索它在哪里使用defineClass (see here results),你会发现很多具体的类,它们最终调用了definClass

这并不简单,其中一些类覆盖defineClass,而其他类调用自己的loadClass,然后调用...以此类推,但最后它调用了defineClass

不要忘记,ClassLoaderdefineClass以以下三个本机方法之一结束:defineClass0defineClass1和/或defineClass2

编辑

本机函数defineClass0ClassLoader.c调用Java_java_lang_ClassLoader_defineClass0,对于1和2函数也是如此。

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

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

希望它能回答你的问题。

票数 5
EN

Stack Overflow用户

发布于 2015-12-12 13:04:03

代码语言:javascript
复制
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
              . . .
         }
     }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34070594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档