首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ClassLoader混淆

ClassLoader混淆
EN

Stack Overflow用户
提问于 2009-04-03 11:21:28
回答 3查看 1.4K关注 0票数 10

我见过几个地方"Class.getClassLoader()返回用于加载特定类的ClassLoader“,因此,我被下面示例的结果弄糊涂了:

代码语言:javascript
复制
package test;

import java.lang.*;

public class ClassLoaders { 
    public static void main(String[] args) throws java.lang.ClassNotFoundException{
      MyClassLoader mcl = new MyClassLoader();
      Class clazz = mcl.loadClass("test.FooBar");
      System.out.println(clazz.getClassLoader() == mcl); // prints false
      System.out.println(clazz.getClassLoader()); // prints e.g. sun.misc.Launcher$AppClassLoader@553f5d07
    }
}

class FooBar { }

class MyClassLoader extends ClassLoader { }

语句clazz.getClassLoader() == mcl不应该返回true吗?有人能解释一下我在这里遗漏了什么吗?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-04-03 11:28:16

每当您创建自己的类加载器时,它都会附加在类加载器的树状层次结构中。要装入一个类,类加载器首先将装入委托给它的父类。只有当所有的父类都没有找到这个类时,首先被要求加载一个类的加载器才会尝试加载它。

在您的特定情况下,加载被委托给父类加载器。尽管您要求MyClassLoader加载它,但执行加载的是父进程。在本例中,它是AppClassLoader。

票数 17
EN

Stack Overflow用户

发布于 2009-04-03 11:29:35

引用API doc of ClassLoader

每个ClassLoader实例都有一个关联的父类加载器。当被请求查找类或资源时,ClassLoader实例将在尝试查找类或资源本身之前将对类或资源的搜索委托给它的父类加载器。

票数 6
EN

Stack Overflow用户

发布于 2009-04-03 11:27:35

如果自定义的类加载器将调用委托给VM的类加载器,则由谁加载类。clazz.getClassLoader()将返回这个类加载器。

为了深入了解细节:ClassLoader类的Javadoc提供了以下对执行步骤顺序的解释:

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

  1. 调用findLoadedClass(String)以检查类是否已加载。
  2. 调用父类加载器上的loadClass方法。如果父类为null,则使用虚拟机内置的类加载器,使用findClass( instead.
  3. Invoke )方法查找该类。

由于您继承的方法没有更改,因此此行为将保持不变。步骤2将是加载类的步骤。当您调用ClassLoader的无参数构造函数(自动,因为您没有在MyClassLoader中定义构造函数)时,您会自动使用内置的ClassLoader。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/713540

复制
相关文章

相似问题

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