ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java类加载器

2021-11-23 15:59:17  阅读:112  来源: 互联网

标签:20Files jdk1.8 Java Program% 111 file 加载


ClassLoader的分类

Java中的ClassLoader有三种:Bootstrap ClassLoader 、Extension ClassLoader、App ClassLoader。以下是jdk1.8的类加载器

ClassLoader结构

 加载路径

package com.example.demo;

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

public class Test {
    public static void main(String[] args) {
        System.out.println("BootstrapClassLoader 的加载路径: ");

        //String[] bootUrls = System.getProperty("sun.boot.class.path").split(";");

        URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
        for (URL url : urls)
            System.out.println(url);
        System.out.println("----------------------------");

        //取得扩展类加载器
        URLClassLoader extClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader().getParent();

        System.out.println(extClassLoader);
        System.out.println("扩展类加载器 的加载路径: ");

        urls = extClassLoader.getURLs();
        for (URL url : urls)
            System.out.println(url);

        System.out.println("----------------------------");


        //取得应用(系统)类加载器
        URLClassLoader appClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();

        System.out.println(appClassLoader);
        System.out.println("应用(系统)类加载器 的加载路径: ");

        urls = appClassLoader.getURLs();
        for (URL url : urls)
            System.out.println(url);

        System.out.println("----------------------------");
    }

}

运行结果如下:

BootstrapClassLoader 的加载路径: 
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/resources.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/rt.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/sunrsasign.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/jsse.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/jce.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/charsets.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/jfr.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/classes
----------------------------
sun.misc.Launcher$ExtClassLoader@776ec8df
扩展类加载器 的加载路径: 
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/access-bridge-64.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/cldrdata.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/dnsns.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/jaccess.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/jfxrt.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/localedata.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/nashorn.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/sunec.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/sunjce_provider.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/sunmscapi.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/sunpkcs11.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/zipfs.jar
----------------------------
sun.misc.Launcher$AppClassLoader@18b4aac2
应用(系统)类加载器 的加载路径: 
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/charsets.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/deploy.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/access-bridge-64.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/cldrdata.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/dnsns.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/jaccess.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/jfxrt.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/localedata.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/nashorn.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/sunec.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/sunjce_provider.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/sunmscapi.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/sunpkcs11.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/ext/zipfs.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/javaws.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/jce.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/jfr.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/jfxswt.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/jsse.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/management-agent.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/plugin.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/resources.jar
file:/F:/Program%20Files/Java/jdk1.8.0_111/jre/lib/rt.jar
file:/F:/myproject/demo/target/classes/

自定义类加载器
 

package com.example.demo;

public class Test {
    public static void main(String[] args) throws ClassNotFoundException {
        String classPath = "F:/";
        CustomerClassLoader myClassLoader = new CustomerClassLoader(classPath);
        String packageNamePath = "LogTest";
        Class logTest = myClassLoader.loadClass(packageNamePath);
        System.out.println("classloader is :" + logTest.getClassLoader().getClass().getName());
    }
}
package com.example.demo;

import java.io.FileInputStream;

public class CustomerClassLoader extends ClassLoader {
    private String loadPath;

    public CustomerClassLoader(String loadPath) {
        this.loadPath = loadPath;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        try {
            byte[] bytes = loadByte(name);
            return defineClass(name, bytes, 0, bytes.length);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return null;
    }

    private byte[] loadByte(String className) throws Exception {
        className = className.replaceAll("\\.", "/");
        FileInputStream fileInputStream = new FileInputStream(loadPath + "/" + className + ".class");
        int available = fileInputStream.available();
        byte[] data = new byte[available];
        fileInputStream.read(data);
        fileInputStream.close();
        return data;
    }
}

标签:20Files,jdk1.8,Java,Program%,111,file,加载
来源: https://blog.csdn.net/duqingqing5666/article/details/121396449

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有