我知道我可以通过以下方式获取类的类加载器
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/