美文网首页Java技术拾遗
自定义类加载器

自定义类加载器

作者: a21455ce3dba | 来源:发表于2017-09-01 17:04 被阅读4次

类加载器和机制

关于类和类加载器还有类的加载机制请见
http://www.jianshu.com/p/150c88d68276

类加载器实现

一个简单的类加载器的实现就是实现 ClassLoader 抽象类的 loadClass()函数

package tk.youngdou;

import java.io.IOException;
import java.io.InputStream;
public class ClassLoaderTest {
    public static void main(String[] args) {
        createClassLoader("");
    }
    
    private static void createClassLoader(String name) {
        ClassLoader myLoader = new ClassLoader() {
            @Override
            public Class<?> loadClass(String name) throws ClassNotFoundException {
                try{
                    String filename = name.substring(name.lastIndexOf(".") + 1) + ".class";
                    InputStream is = getClass().getResourceAsStream(filename);

                    if (is == null) {
                        return super.loadClass(name);
                    }

                    byte[] b = new byte[is.available()];
                    is.read(b);
                    return defineClass(name, b, 0, b.length);

                } catch (IOException e) {
                    e.printStackTrace();
                    throw new ClassNotFoundException(name);
                }
            }
        };

        ClassLoader classLoader_mine = myLoader;
        ClassLoader classLoader_app = myLoader.getParent();
        ClassLoader classLoader_ext = classLoader_app.getParent();
        ClassLoader classLoader_boot = classLoader_ext.getParent();

        System.out.println(classLoader_mine.toString());
        System.out.println(classLoader_app.toString());
        System.out.println(classLoader_ext.toString());
        System.out.println(classLoader_boot);

    }
}

输出

tk.youngdou.ClassLoaderTest$1@4554617c
sun.misc.Launcher$AppClassLoader@14dad5dc
sun.misc.Launcher$ExtClassLoader@74a14482
null

可见自定义的类加载器会继承自AppClassLoader的,而AppClassLoader不是继承自ExtClassLoader,详情回见
http://www.jianshu.com/p/150c88d68276

原理

那么自定义的类加载器可以不继承 AppClassLoader 吗?
一般来说,不行。

  • 首先ClassLoader没有 setParent()函数。
  • ClassLoader的已经硬编码了

具体直接上代码

类:ClassLoader.class

image.png

类:ClassLoader.class

image.png

类:ClassLoader.class

image.png

类:Launcher.class

image.png

classloader 其实在初始化的时候就设定为应用加载器

类:Launcher.class

image.png

参考

《深入理解java虚拟机》——周志明

相关文章

网友评论

    本文标题:自定义类加载器

    本文链接:https://www.haomeiwen.com/subject/cwjkjxtx.html