ClassLoader

获取ClassLoader的方法

对于一般的java类如下两种方法获得的ClassLoader通常都是同一个

1. this.getClass.getClassLoader(); // 使用当前类的ClassLoader
  2. Thread.currentThread().getContextClassLoader(); // 使用当前线程的ClassLoader
  3. ClassLoader.getSystemClassLoader(); // 使用系统ClassLoader,即系统的入口点所使用的ClassLoader。

(注意,system ClassLoader与根ClassLoader并不一样。JVM下system ClassLoader通常为App ClassLoader)

ClassLoader 详解 /类加载原理

1. classLoader是什么?
ClassLoader是类的加载器,用于加载class对象到JVM中的,分为2种,启动类加载器和实际类加载器.

2. ClassLoader的作用
java文件通过javac.exe编译成.class文件,然后通过classLoader加载到JVM内存中. 加载到JVM内存的就是Class对象,存储着.class字节码内容,每一个class对象都有getClassLoader()方法, 得到是谁把我从.class文件加载到内存中变成Class对象的。
3. ClassLoader层次结构
 1).根类加载器(null) …由本地代码(c/c++)实现,加载(%JAVA_HOME%\jre\lib)

2).扩展内加载器(ExtClassLoader) … 主要加载扩展目录下的jar包, %JAVA_HOME%\lib\ext

3). 应用类加载器(AppClassLoader) …主要加载我们应用程序中的类
4. Class加载时调用类加载器的顺序

应用类加载器 ----委托加载—》 扩展类加载器–委托加载—》 根类加载器

当一个类要被加载时,有一个启动类加载器和实际类加载器的概念,这个概念请看如下分析

如上面的Test.class要进行加载时,它将会启动应用类加载器进行加载Test类,但是这个应用类加载器不会真正去加载他,而是会调用看是否有父加载器,结果有,是扩展类加载器,扩展类加载器也不会直接去加载,它看自己是否有父加载器没,结果它还是有的,是根类加载器。

所以这个时候根类加载器就去加载这个类,可在%JAVA_HOME%\jre\lib下,它找不到com.Test这个类,所以他告诉他的子类加载器,我找不到,你去加载吧,子类扩展类加载器去%JAVA_HOME%\lib\ext去找,也找不着,它告诉它的子类加载器 AppClassLoader,我找不到这个类,你去加载吧,结果AppClassLoader找到了,就加到内存中,并生成Class对象。

这个时间时候启动类加载器(应用类加载器)和实际类加载器(应用类加载器)是同一个。

ClassLoader利用其特性可以防止java核心类被覆盖。编写java.lang.Long类,定义一个main方法,执行该main方法时,会出现找不到main方法的提示。

没有main方法是因为执行的根本不是我们自己写的类,执行的是java核心中的那个Long类,当然没有main方法了。 这样就防止我们应用中写的类覆盖掉java核心类。

特性:

类加载器基于三个机制:委托、可见性和单一性,

委托机制是指将加载一个类的请求交给父类加载器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它。

可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。

单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类。

his.getClass().getClassLoader().getResource(“impProductTemp.xls”); --URL

返回的URL是通过java.net.URLEncoder.encode()编码的字符,

在转换层File对象时,需要先通过java.net.URLDecoder.decode()转换一下,才能得到相应的File对象

https://www.cnblogs.com/alisonGavin/p/6851062.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值