java类加载小结一下下

一:了解ClassLoader:实现对类的动态加载。

在程序运行时,设置Arguments选项中的VM Arguments-verbose:class,会详尽的给出类在运行过程中先后加载的文件;由此可以看出类在运行过程中不断进行动态加载,而不是一次性全加载到内存中去。对于静态语句块,在执行过程中只加载一次。而Dynamic语句块每次New新的对象都会再执行一遍。等同于在每个构造方法中都必须执行的一条语句。

二:Jdk内置的classloader

1bootstrap classloader(加载最核心的java类,由操作语言本地语言,如C语言,C++或者汇编;该ClassLoader没有名字,如果要调用它的GetName()方法的话返回空值。)

2Extension classloader:装载 jre.lib.ext目录下的所有类的装载,没有父类装载器; java语言开发;

3Application ClassLoader: 应用程序的加载的类

4)其它各种ClassLoader

Jdk的各个ClassLoader之间是层次关系,不是继承关系,可以理解为每个具体的装载某一类的ClassLoader都是抽象类ClassLoader的实现实例(继承是存在于类之间的),ClassLoader内有一个名为Parent的引用指向了它上一层次的ClassLoader对象(父类加载器)。在实例化每个类加载器的时候需要为其指定一个Parent(父类加载器),不指定时一般默认为AppClassLoader

(三)类的加载模式(委托模式)

每个ClassLoader只能加载特定位置和目录中的类,但是ClassLoader的加载模式一种委托模式,当需要加载某个类时,由ClassLoader loadClass方法去查找该类是否已经被加载过,如果没有的话,则委托该ClassLoader的父加载器去加载,父加载器也在其LoadClass方法中查找该类是否已经加载过,如果没有的话再交由其父类加载器去加载,这样一直到ExtClassLoader,如果还是不能加载,则由BootStrap进行加载,如果BootStrap仍然不能加载的话,则退回到最初的类加载器,这时才由该类加载器调用它的FindClass方法去进行它力所能及的范围内加载,如果它不能在它的范围内找到并加载,则会报告ClassNotFoundException

(四)委托模式的好处:通过该委托模式能够保证一个类只会被加载一次,不会出现多个类加载器都为同一个类创建字节码数据的情况。同时也能够防止许对恶意代码的破坏。

(五)在类中调用另一个类的时候的加载方法总结:张孝祥老师在他《深入体验Java web 开发内幕》一书中总结的相当经典:根据一个类存放的位置,这个类最终只能由一个特定的类装载器装载。对于一个已经被父类装载器装载了的类来说,java虚拟机默认的也是用这个父类装载器去装载它所调用的其它类,由于父类装载器不会委托子类装载器去装载类,所以在一般情况下,一个已经被父类装载器装载的类无法调用那些只能被子类装载器发现和装载的其他类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值