Java ClassLoader --第一篇【类加载路径】

最近再看 Java类加载器的问题,在此开个系列分几期来分享学习 java的类加载,先从类加载的路径讲起,至于类的3个加载器 以及双亲委派机制,将会在接下来几期根据源码阅读分享。

先上源码展示效果

首先定义一个自定义类加载器

import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLStreamHandlerFactory;

/**
 * 自定义类加载器
 */
public class MyClassLoader extends URLClassLoader {

    public MyClassLoader(URL[] urls, ClassLoader parent) {
        super(urls, parent);
    }

    public MyClassLoader(URL[] urls) {
        super(urls);
    }

    public MyClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory) {
        super(urls, parent, factory);
    }
}

 

打印各个加载器的加载路径

import sun.misc.Launcher;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

public class TestClassLoader {
    public static void main(String args[]) throws MalformedURLException {
        //类加载器测试
        String myFilePath = "C:\\Users\\Administrator\\Desktop\\";
        URL[] urls = new URL[1];
        urls[0] = new File(myFilePath).toURI().toURL();
        //实例化 自己的类加载器
        MyClassLoader myClassLoader = new MyClassLoader(urls);
        // 打印各个加载器的 加载路径
        //1.启动类加载器,加载路径
        System.out.println("启动类的加载路径: ");
        for(URL url : Launcher.getBootstrapClassPath().getURLs())
            System.out.println(url);
        System.out.println("----------------------------");
        //2.扩展类加载器,加载路径
        URLClassLoader urlClassLoaderParent = (URLClassLoader) ClassLoader.getSystemClassLoader().getParent();
        System.out.println(urlClassLoaderParent+"扩展类的加载路径: ");
        for(URL url : urlClassLoaderParent.getURLs())
            System.out.println(url);
        System.out.println("----------------------------");
        //3.应用类加载器,加载路径
        URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        System.out.println(urlClassLoader+"应用类的加载路径: ");
        for(URL url : urlClassLoader.getURLs())
            System.out.println(url);
        System.out.println("----------------------------");

        System.out.println(myClassLoader+"自定义类的加载路径: ");
        for(URL url : urls)
            System.out.println(url);
        System.out.println("----------------------------");

    }
}

效果截图

从截图效果明显可以看出

启动类加载器(Bootstrap class loader 由C++ 编写,后期分析源码) 加载的文件路径为 jdk 下的 lib目录

扩展类加载器(ExtClassLoader) 加载的文件路径为jdk lib 下的 ext 目录

应用类加载器(AppClassLoader) 加载的为 classpath下的路径,此处可以打开环境变量 就可以看看CLASSPATH的配置

自定义类加载器 加载的是 自定义加载器构成方法传入的指定路径

      特别说明:运行此Demo的时候 不要在Idea下允许,不然 AppClassLoader 会打印很多路径,当然这也没什么问题,因为启动类加载器 加载的就是 classpath 下路径,

idea 默认配置了很多classpath  对我们可能会造成一些误会,建议直接 cmd java xxx 运行 

附上Idea的 classpath 图

本期主要介绍各个加载器的 加载路径,首先有个初步了解 下期 我们将分别解析每个加载器

END

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

H风雨Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值