2018-11-19学习日记

类加载器

类加载器 Classloader 用来夹在java类到javaxuni虚拟机中,一般来说,jaa虚拟机使用java流泪的方式如下,:java源程序java文件在经过java编译器编译后就被转换为java字节代码 class文件.类加载器负责读取Java字节代码,并转换为java.lang.Class类的一个实例,每个这样的实例用来表示一个java类,通过这个实例的newINstance方法就可以创建出这个类的一个对象.

类加载器包括引导类加载器,扩展类加载器,系统类加载器

(bootstrap类加载器)引导类加载器主要用来加载java的核心库,就是java_home/lib/rt.jar下的JDK类文件,不继承自classloader类,所以bootstrap类加载器也叫初始类加载器

(extension类加载器)拓展类加载器主要用来加载java的拓展库,就是java_home/lib/ext的库或者java.ext.dirs系统属性定义的目录下加载类

(application&system类加载器)系统类加载器是用来加载classpath环境变量,一般来说java的类都是由这个加载器来加载的

classpath定义的是类文件的加载目录,path是定义的执行程序,如javac,java等的执行路径

 

载器的三个特点:

1.委托:类加载器会把加载一个类的请求交给父类加载器,如果父类不能加载,自己再进行加载

2.可见性:子类的加载器可以看到所有父类加载器加载的类,但是父类加载器不能看到子类加载器加载的类

3.单一性:仅加载一个类依次,这个特性是由委托机制保证子类加载器不会加载父类加载器加载过的类

总结一下就是:我所有的工作都由我的父亲做,如果他做不了,我才去做,他的东西是我的,我的不是他的,所有的事情保证只做依次,==一次,避免工作的重复

java中提供了加载类的API,Class.forName()

类的加载时通过调用java.lang.ClassLoader的

 

loadClass()方法,loadclass()方法diao调用了findClass()方法来定位相应类的字节码,然后调用defineClass()方法来讲将字节码转换成类实例''

java判断两个java类是否相同的办法:

1.检查两个类的全名是否相同

2.检查两个类的类加载器是否相同

代理模式(委托加载模式)是为了保证假把核心库的类型安全,所有java应用都至少需要引用java.lang.Object类,如果这个加载过程是由自己的类加载器完成的,很可能就存在多个版本的java.lang.Object类,并且这些类之间是不兼容的,通过java核心库的类的加载工作由bootstrap类加载器来统一完成,保证了java应用所使用版本的java核心库的类,是相互兼容的

 

ClassNotFoundExceptionshsh是加载类的时候,该路径下找不到对应的class文件

NotClassDefFoundError是一个类中引用了另外的一个类,被引用的类已经被编译过了,但是运行的时候class文件不存在了

类加载器会首先代理给其他类加载器来尝试加载某个类,这就意味着真正完成类的加载工作的类加载器和启动zheg这个加载过程的类加载器,有可能不是同一个.真正完成类的加载工作是通过调用defineClass来shix实现的,启动类的加载过程是通过调用loadClass来实现的,定义加载器是实际进行加载工作defineClass的类加载器,初始加载器是调用loadClassfang方法的类加载器

总结一下就是 哪个加载器发起的活动,哪个加载器实际执行的活动

Class.forName是一个ji静态方法,用来加载类,最常见的用法是加载数据库驱动的时候,如:Class.forName('org.apacapache.derby.jdbc.EmbeddedDriver').newInstance()用来加载Derby数据库的驱动

对于运行在java EE容器中的Web应用来说,该类加载器也使用代理模式,所不同的是,他首先尝试去加载某个类,如果找不到再代理给父类,目的是使得Web应用自己的类的优先级高于Web容器提供的类,java核心库的类是不使用代理模式的

Web应用的java类文件存放在WEB-INF/classes目录下

使用的库的jar包是保存在WEB-INF/lib目录下

Web应用必须要有system library和java ee library

jre system library是jdk的库

java ee library是servlet相关的库

这两个库对于Web容器都是必须的

 

 

总结:

通过了解类加载器的知识学习到了java的运行流程:文件由javawen文件经过jre library编译为class文件,然后系统将class文件转换为机器码,转化为java.lang.class的一个实例,这一个实例就代表一个类

不同的类可能是不同的类加载器加载出来的

代理模式的使用,避免了所有的事情都是亲力亲为,但是在某些情况下,使用情况是不同的

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值