【问题标题】:How does Java find already loaded classes?Java如何找到已经加载的类?
【发布时间】:2013-09-14 01:18:46
【问题描述】:

我知道 Java 使用 ClassLoader 层次结构来加载类。

例如一个程序:

public void test(){
    A a = new A(); // Line 1 The class is accessed first time here so it should be loaded and defined

    A ab = new A(); //Line 2 How can the second line be represented?
}

第一行代码类似

Thread.currentThread().getContextClassLoader().loadClass("A");

所以类被加载并定义为创建Class的实例。

现在的问题是,当第二行执行时,Class A 再次被引用,Java 会不会再次查找该类并返回该类的相同加载实例?

正如 Java 类加载器文档所说,每个类加载器都应该维护已加载类的实例,并为下一次调用返回相同的实例。

Java 将加载的类保存在哪里? ClassLoader 类有一个 Vector 类,VM 调用它来添加加载的类。

也许这个问题有点令人困惑,基本上我是想弄清楚已经加载的类是从哪个方法返回的。我试图在loadClass() 方法中保留一个调试点,但Line 2 没有调用它。

ClassLoaderloadClass() 方法有 findLoadedClass 方法,但也没有调用。

【问题讨论】:

    标签: java class classloader


    【解决方案1】:

    如果您想将提及的A“翻译”为任何方法调用,那么您可以获得的最接近的不是loadClass(),而是Class.forName()

    此方法调用查询类加载器的类,这可能会或可能不会触发类加载(调用者甚至不关心)。它只会将一个完全加载的(如果您不使用the three-argument version,则已初始化)类返回给调用者。

    一旦类被加载,类加载器在使用时不再被调用(顾名思义,一旦加载类,它的工作就完成了)。

    【讨论】:

      【解决方案2】:
      package java_language;
      
      public class NewClass {
      
          Java_language j;
          
          public NewClass() throws ClassNotFoundException {
              j=new Java_language();
               if (Class.forName("java_language.Java_language", true, Thread.currentThread().getContextClassLoader()).equals(j.getClass())) {
                  System.out.println("CLass has been loaded");
              }
          }
      
          public static void main(String[] args) throws ClassNotFoundException {
             new NewClass();
              
          }
      
      }
      
      package java_language;
      
      public class Java_language {
      
          static Java_language java_language = null;
          public Java_language() {
              System.out.println("Stack Overflow");
          }
      }
      

      答案是: enter image description here

      【讨论】:

        猜你喜欢
        • 2017-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-16
        相关资源
        最近更新 更多