当前位置:  开发笔记 > 编程语言 > 正文

ClassLoader混淆

如何解决《ClassLoader混淆》经验,为你挑选了2个好方法。

我看过几个地方"Class.getClassLoader()返回用于加载该特定类的ClassLoader",因此,我对以下示例的结果感到困惑:

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吗?有人可以解释我在这里缺少的东西吗?

谢谢.



1> paweloque..:

无论何时创建自己的类加载器,它都将附加在类加载器的树状层次结构中.要加载类,类加载器首先将加载委托给其父级.只有当所有父母都没有找到该类时,首先要求加载类的加载器才会尝试加载它.

在您的特定情况下,加载被委托给父类加载器.虽然您要求MyClassLoader加载它,但它是进行加载的父级.在这种情况下,它是AppClassLoader.



2> Michael Borg..:

引用ClassLoader的API文档:

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

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有