Class.java及ClassLoader源码学习

1、Class类的说明

     实例、接口都是class,枚举是类,注解是接口,数组和基本数据类型也是类。基本数据类型(Int、float、byte、short等)的类和数据类(Integer、Float等)不是一个class。Class.java的私有构造函数只能JVM去调用,objects是JVM自动创建的,但是classes是类加载器加载的。

2、类运行时构造

JVM动态加载体现在,Class t = Class.forName("java.lang.Thread") 可以在运行时初始化类。

T t1 = Class.forName("T").newInstance()用来创建一个无参实例(调用无参构造函数)。

3、ClassLoader的说明

ClassLoader负责loading classes,具体过程是通过二进制类名,在文件系统中读取对应的class文件, 每一个object可以调用getClassLoader去得到对应的加载类  ClassLoader loader = t1.getClass().getClassLoader(); 数组对象是如果是基本数据类型,则没有classloader。Classloader使用委托模型(delegation modle)(递归寻找)去寻找classes和resources,即classloade使用其父loader去搜索,但是BootstrapClassLoader(built-in classloader)没有parent loader,是JVM直接调用。ClassLoader默认是并行调用,并行调用可能会在loading classes的期间导致死锁。用法:

ClassLoader loader = new NetworkClassLoader(host,port);

Object main = loader.loadClass("Main","true").newInstance();

4、加载类UML

Bootstrp loader
Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类。

ExtClassLoader  
Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader.ExtClassLoader是用Java写的,具体来说就是 sun.misc.Launcher$ExtClassLoader,ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext,此路径下的所有classes目录以及java.ext.dirs系统变量指定的路径中类库。

AppClassLoader 
Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为 ExtClassLoader。AppClassLoader也是用Java写成的,它的实现类是 sun.misc.Launcher$AppClassLoader,另外我们知道ClassLoader中有个getSystemClassLoader方法,此方法返回的正是AppclassLoader.AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档,它也是Java程序默认的类加载器

 

URLClassLoader

只有当URLClassLoader被创建才会被调用,加载指定URL的类。

 

ClassLoader

抽象类,用户可以继承后自定义加载类。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值