代码之家  ›  专栏  ›  技术社区  ›  Miguel Gamboa

为什么是A.class。getClassLoader()不返回加载器使用的加载器。负荷等级(“A”)

  •  1
  • Miguel Gamboa  · 技术社区  · 7 年前

    A GwClassLoader . 然而 A.class.getClassLoader() 不检索该类装入器?这是测试用例:

    class A{
      static {
        ClassLoader loader = A.class.getClassLoader();
        System.out.println("A.<cinit>: " + loader);
      }
    }
    
    class ClassLoaderGw extends ClassLoader { }
    
    public class App {
      public static void main(String [] args)  throws ClassNotFoundException,  InstantiationException,  IllegalAccessException {
        ClassLoaderGw loader = new ClassLoaderGw();
        System.out.println("Main: " + loader);
        Class<?> klass = loader.loadClass("A");
        Object obj = klass.newInstance();
      }
    }
    

    这是运行类的输出 App

    Main: ClassLoaderGw@6d06d69c
    A.<cinit>: sun.misc.Launcher$AppClassLoader@73d16e93
    

    我如何获得 GwClassLoader A. ?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Stephen C    7 年前

    这个 ClassLoaderGw ClassLoader 不重写任何方法。因此,它将遵循标准的策略 loadClass 方法( javadoc ) ... 首先委托给父类加载器。

    在这种情况下,您的 A 类位于父类加载器的类路径上,因此 那个

    谜题的最后一块是 getClassLoader() 返回类加载器


    如何在类A的静态构造函数中获取GwClassLoader的实例?

    基本上,你不能。。。除非 GwClassloader 负责加载类

    你能 有效吗?好如果使用不同的类加载策略,则可以。大概如果 能够找到的字节码 然后打电话 defineClass 它本身就是 .

    也可以由父类加载器加载。如果发生这种情况,你可以有两个不同的 A. 同时存在的类型。这可能会在意外的地方导致类强制转换异常。

        2
  •  1
  •   Andy Turner    7 年前

    这在中进行了描述 the Javadoc

    加载具有指定二进制名称的类。此方法的默认实现按以下顺序搜索类:

    • 调用findLoadedClass(String)检查该类是否已加载。
    • . 如果父对象为null,则使用虚拟机内置的类加载器。
    • 调用findClass(String)方法来查找该类。

    ClassLoader sun.misc.Launcher$AppClassLoader1 作为家长,因为正如 default constructor ClassLoaderGw

    使用getSystemClassLoader()方法返回的类加载器作为父类加载器,创建一个新的类加载器。