相信很多写过web项目的会对this.this.class.getClassLoader().getResourceAsStream(path)这段代码有疑惑。我们用这段代码可以获取在classpath路径下的资源文件的输入流。为什么是classpath而不是src,因为当web项目运行时,IDE编译器会把src下的一些资源文件移至WEB-INF/classes,classPath目录其实就是这个classes目录。这个目录下放的一般是web项目运行时的class文件、资源文件(xml,properties...);
然后我们可以仔细分析一下这段代码,this.class是获取当前类的class对象,getClassLoader()是获取当前的类加载器
,什么是类加载器?简单点说,就是用来加载java类的,类加载器就是负责把class文件加载进内存中,并创建一个java.lang.Class类的一个实例,也就是class对象,并且每个类的类加载器都不相同.getResourceAsStream(path)是用来获取资源的,因为这是ClassLoader(类加载器)了获取资源,而类加载器默认是从classPath下获取资源的,因为这下面有class文件.所以这段代码总的意思是通过类加载器在classPath目录下获取资源.并且是以流的形式.同时path不能以’/'开头,否则会报错.
顺便聊一下java类加载的过程吧
3个步骤:1.加载,加载类的二进制文件。
2.链接:
(1)验证,验证字节码的结构是否正确
(2)准备,给静态成员分配空间并赋予默认值(注意这里:静态变量的第一次赋值是在类加载的时候就进行了,与后面初始化的时候的自定义赋值不是同一过程,也就是静态成员在初始化的时候可能已被赋值二次了)
(3)解析,将符号引用变为直接引用
3初始化,为静态成员赋予自己给定的初值
类的实例化的顺序:
(1)静态成员、方法与静态代码块的初始化与执行
(2)普通成员、方法与普通代码块的初始化与执行
(3)构造函数的执行(父类的构造函数先执行)