java - 如何理解 "Every Class object contains a reference to the ClassLoader that defined it. "?

标签 java class jvm classloader

  • 我知道我可以通过以下方式获取类的类加载器 xxxclass.class.getClassLoader(),但是xxxclass到底在哪里 持有定义它的类加载器的引用? 例如

    public class ClassA {    
        System.out.println("I am class A"); 
    }
    

    我在ClassA中没有看到任何关于类加载器引用的线索。然而, 我可以通过使用获取 ClassA 的类加载器 ClassA.class.getClassLoader().

  • ClassA.class.getClassLoader() 是如何工作的?

最佳答案

ClassLoader 文档中出现的句子是:

Every Class object contains a reference to the ClassLoader that defined it.

注意到这两个链接了吗?他们告诉您的是,文档引用的是 Class 对象,而不是类 ClassA 的普通对象。

您在 Java 中定义的每个类都有一个与之关联的 Class 对象,这使您可以在元级别查看该类。也就是说,将类本身视为一个对象,将其作为参数传递,对其使用反射等。

正如您所注意到的,访问 Class 对象的一种方法是使用 ClassA.class。如果您有对 ClassA 类型的对象的引用:

ClassA myObj = new ClassA();

然后您可以使用myObj.getClass()获取Class对象。

因此,myObj 对象中没有对 ClassLoader 的引用,仅在其关联的 Class 对象中。

现在,另一个链接告诉您在拥有 Class 对象后如何获取对 ClassLoader 对象的引用 - 通过 getClassLoader()方法。

现在,如果您查看 Class 类的源代码,您将看到:

@CallerSensitive
public ClassLoader getClassLoader() {
    ClassLoader cl = getClassLoader0();
    if (cl == null)
        return null;
    SecurityManager sm = System.getSecurityManager();
    if (sm != null) {
        ClassLoader.checkClassLoaderPermission(cl, Reflection.getCallerClass());
    }
    return cl;
}

因此它调用getClassLoader0()来获取类加载器。其来源为:

native ClassLoader getClassLoader0();

也就是说,类加载器引用实际上是这个Java类的原生结构的一部分,使用Java语言工具是看不到的。尽管如此,它仍然存在,并且您可以通过上述方法使用。

关于java - 如何理解 "Every Class object contains a reference to the ClassLoader that defined it. "?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28165179/

相关文章:

java - 有没有办法重新使用 <util :list> in spring configuration file?

Java:如何通过鼠标单击中断程序执行中途

JAVA 10+ -XX :MaxRAMPercentage flag in Kubernetes container

java - 哪个版本的 Maven Artifact 适用于哪个 JVM

java - 变量声明

java - 无法运行程序线程 "main"NoClassDefFoundError : (wrong name: access/control/accessControlUI) 中出现异常

java - 保存数据以在多个 Activity 中使用

c++ - 在 Arduino 中使用 C++ 类

swift - 我们应该如何初始化结构和类中存储的属性?

testing - 如何为所有重要的测试库编写匹配器?