Class文件与类加载器

.class:
.class中含有代码和支持代码运行的元数据(metadata)。
代码部分就是字节码;
元数据部分 则包括诸如类名、成员名、方法签名、常量池、方法大小、方法的求值栈占用量等许多信息。
所以Class文件包含字节码,但不只有字节码。

类加载器:
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的"二级制字节流"这个动作放到java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为类加载器。
自定义加载器:。
APP ClassLoader(应用程序加载器)
classpath指定的jar和目录 ,负载加载用户类路径(class path)上指定的类库。
EXT ClassLoader (扩展类加载器)
jre/lib/ext/*.jar,开发者可以直接使用扩展类加载器。
BootStrap ClassLoader(启动类加载器)
jre/lib/rt.jar,使用C++语言实现,是虚拟机自身的一部分,无法被java程序直接引用。

双亲委派模型:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的类加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需要的类)时,子加载器才会尝试自己去加载。

通过类加载器加载资源:
普通java类通过加载器加载资源:
     
getclassloader()返回的目录是classes,所以文件位置相对于classes目录。
该方式存在问题:虽然可以得到资源数据,但无法获取更新后的数据,所以通常采用如下方式:
   
即先通过类加载器得到资源文件位置,之后通过IO获取资源文件。

在web工程读取资源时往往通过context对象进行读取。

猜你喜欢

转载自blog.csdn.net/Tichgd/article/details/80335459