文档章节

关于JAVA ClassLoarder机制与一个示例

my_juke
 my_juke
发布于 05/29 11:16
字数 636
阅读 7
收藏 3

ClassLoader

这个大家熟悉,加载机制,双亲委派。
JAVA启动时,会初始化3个类加载器,BootClassLoader,ExtClassLoader,AppClassLoader。
BootClassLoader 加载jre/lib下的JAR包,由C++实现。 ExtClassLoader 加载jre/lib/ext下的JAR包,其父加载器为BootClassLoader。 AppClassLoader 加载classpath下的JAR包,也称用户加载器。其父加载器为ExtClassLoader。

示例

常用的自定义类加载器为tomcat,spring-boot会有自己的类加器。 我们现在自己实一个类加载器,从e:/arthas目录下加载class。类加载器除了加载Class还有一个主要功能,那就是加载资源。这里我们简单一点,直接继承URLClassLoader。如果要自己做的话,那就继承ClassLoader,然后重写findClass和findResource方法。

调用类B.java

public class B {


    public static void main(String[] args) throws InterruptedException {
        FileClassLoad fileClassLoad = new FileClassLoad();
        try {
            Class clazz = fileClassLoad.loadClass("spring.B1");
            System.out.println(clazz);
            clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }

    }
	}

两个测试类B1.java B2.java

public class B1 {
   
   public B1(){
       
       B2 b2 = new B2();
       b2.say();
   }
   
}
public class B2 {

   public void say(){
       URL url = this.getClass().getResource("test.txt");
       System.out.println(url);
       System.out.println(B2.class.getClassLoader());
   }
}

FileClassLoader自定义加载器

public class FileClassLoad extends URLClassLoader {

    private static  URL[] urls = null;

    static{
        try {
            File file = new File("E://arthas/");
            urls = new URL[1];
            urls[0]=file.toURI().toURL();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        System.out.println(name);
        return super.findClass(name);
    }

    public FileClassLoad(){
        super(urls);
    }
}

编译,将它从class目录下移除,如果不移除的话,执行后,不会用到我们的自定义加载器,那test.txt将会获取不到。这就是双亲,先从父加载器加载,父加载器加载不到,再从当前加载器进行加载。
将B1.class B2.class按包结构考备到e:/arthas目录下,并且创建test.txt。 运行,结果如下:

spring.B1
class spring.B1
spring.B2
file:/E:/arthas/spring/test.txt   //通过FileClassLoader加载的资源
spring.FileClassLoad@5b2133b1    //B2.class 采用的是我们自定义的加载器,这里是委派,用B1的加载器加载B2

有了这些基础再去看spring-boot的类加载器,就比较方便了。另外spring-boot会什么要用自己的类加载器。答案很简单。spring-boot打出来的JAR里面包含boot-info目录,在该目录下还有jar包和class。spring-boot自定义加载器就是需要加载该目录下的JAR和资源。同里tomcat也是,它也有自己特定格式下的资源,比如war包。

© 著作权归作者所有

上一篇: java8 Stream之原理
下一篇: JAVA锁机制
my_juke
粉丝 4
博文 34
码字总数 22261
作品 0
深圳
私信 提问
在 Hibernate 中直接操作 JDBC 接口

简介: Hibernate 在处理多表关联及分组排序等复杂数据库查询操作时,其固有的 O-R 映射机制会产生大量冗余 SQL 操作,系统性能比传统的 JDBC 低很多。本文分析了 Hibernate 产生此类问题的原...

红薯
2010/04/16
786
2
通过 HttpAuthenticationMechanism 执行 Web 身份验证

通过 Java EE 8 中新的注解驱动的 HTTP 身份验证机制执行经典和自定义的 Servlet 身份验证 系列内容: 此内容是该系列 4 部分中的第 # 部分: Java EE 8 Security API 入门,第 2 部分 http...

Alex Theedom
2018/04/02
0
0
如何以Java实现网页截图技术

今天看到某网友关于“如何以Java实现网页截图技术”的咨询帖,由于出现该咨询的地点非常不适合较长回复,故以博文形式回答。 事实上,如果您想以Java实现网页截图,也就是“输入一段网址,几...

Carl_
2015/03/03
303
7
Java中ThreadLocal的设计与使用

ThreadLocal是什么 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更...

DragonRace
2013/11/25
345
0
透过AccessController深入了解Java安全模型

问题 上一期在使用到MappedByteBuffer时,采用的其中一种方式(AccessController)来释放已分配的内存映射,今天具体探讨一下AccessController的前世今生。 回顾上一期代码: 首先我们先了解...

酱君挺怎样
2018/06/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot 操作ActiveMQ

一、消息队列中间件介绍 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构,是大型分布式系统不可缺少的...

zw965
14分钟前
3
0
本地化存储Storage

为什么会引入Storage(sessionStorage,localStorage,globalStorage) Web storage的目的是克服由cookie带来的限制,当数据需要严格控制在客户端上时,无须持续将数据发回服务器。主要是提供一...

五公里
23分钟前
6
0
Qt编写自定义控件57-直方波形图

一、前言 直方波形图控件非原创控件,控件大全中大概有20-30个控件非自己原创,而是参考了网上开源的代码,自己加以整理和完善,新增了插件的代码使得可以直接集成到QtDesigner或者QtCreator...

飞扬青云
23分钟前
2
0
或许你不知道的10条SQL技巧

这几天在写索引,想到一些有意思的TIPS,希望大家有收获。 一、一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不...

mskk
30分钟前
5
0
IntelliJ IDEA (Mac) 运行速度优化(JVM+localhost)

1.1. JVM 参数配置 打开 idea,菜单 –> help –> edit custom vm options,调整参数,重启即可。 具体调整参数: -Xms2g -Xmx2g -XX:ReservedCodeCacheSize=1024m -XX:+UseCompressedOops 1......

指尖Coding
38分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部