Java 深入分析Class-Loader工作机制-类加载器-Java web实现

Class-Loader类加载器,负责将class加入到JVM中。还可以审查没个类应该由谁进行加载,父优先的加载机制;还可以将Class字节重新解析成JVM统一要求的对象格式;

1)defineClass方法:将byte字节流解析成JVM能够识别的Class对象。

2)findClass方法来实现类的加载规则,从而取得要加载类的字节码。

实现Class-Loader一般会继承URL-Class-Loader这个子类;

1、Class-Loader的等级加载机制

采用双亲委托机制;

BootStrap Class-Loader,主要加载JVM自身工作需要的类,完全JVM自己控制,只是加载工具,没有父类和子类。

JVM加载class文件到内存有两种方式:

1)隐式加载:不通过代码,而是通过JVM来自动加载需要的类到内存;

2)显示加载:通过代码调用Class-Loader来加载一个类

2、如何加载class文件

1)findClass:加载文件包含的字节码到内存中;

-Xbootclasspath设置搜索路径,

2)连接:

字节码的验证:确保格式正确、行为正确;

类准备:class类数据结构分析和相应的内存分配

解析:最后的符号表连接;有许多方式引用类,如超类、接口、字段、方法签名、方法中使用的本地变量;

3)类中静态熟悉和初始化赋值,以及静态块的执行等;

初始化类对象

3、场景的加载类错误分析

1)ClassNotFoundException:主要发生在类加载的时候,加载类通过Class.forName();或者ClassLoader中的loadClass()方法。或者通过ClassLoader中的findSystemClass()方法;

这个错误主要是JVM要加载指定的文件的字节码到内存时,并没有找到这个文件对应的字节码,也就是文件不存在。最好的解决方法就说检查当前的classpath目录下面有没有指定的文件存储。

2)NoClassDefFoundError:

一般是加载命令中没有加载类的包名。

项目遇到的问题:同时出现上述两个错误,原有是JVM隐式加载jar文件后,再显示加载类没有找到,引发前一个错误,导致后一个错误。

解决办法:确保每个类引用的类都再当前的classpath下面;

4、常用的Class-Loader分析

每个Servlet类的加载肯定是通过显示加载方法加载到Tomcat容器中的。

Tomcat仍然沿用了JVM的类加载规范,也就是委托加载。Tomcat会优先检查WebappClassLoader已经加载的缓存,而不是JVM的findLoadedClass缓存。根据webapp目录配置加载。

5、如何实现Class-Loader

1)自定义路径下找到自定义的类文件,实现ClassLoader;

2)特殊处理,例如加密解密,需要自定义ClassLoader;

3)定义类的实效机制,如果类被修改了,可以重新加载,实现热部署。

未完待续。。。。。

插入曲

1、装饰模式

装饰模式对被装饰类的使用者透明;

作用就说赋予被装饰的类更多的功能。

FilterInputStream类是具体的组件,InputStream就是抽象组件,BufferInputStream是具体的装饰器实现,增加了很多的附加功能。

2、装饰模式和适配器模式的区别

适配器模式是一个接口转换为两一个接口,通过改变接口来达到重复适用的目的;

装饰器模式不是要改变被装饰者对象的接口,而是保持原来的接口,但增强原有对象的功能,或者改变处理的方法,提升性能;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洋葱ycy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值