类加载器
1、类初始化的过程
当程序主动使用该类,而该类还未被加到内存中,就会通过如下步骤对类进行初始化
(1)类的加载:将.class文件加载到内存中,并为之生成对应的Class对象,由类加载器来完成---类加载器的作用
(2)类的连接:将类的二进制数据合并到JRE中
(3)类的初始化:JVM负责对类进行初始化(静态的属性和方法)
JVM规范定义了两种类型的类加载器:启动类加载器和用户自定义类加载器
2、类加载器的分类
Bootstrap ClassLoader 根类加载器;
Extension ClassLoader 扩展类加载器;
Sysetm ClassLoader 系统类加载器;
3、各类加载器的作用
Bootstrap ClassLoader 根类加载器
作用:也被称为引导类加载器,负责Java核心类的加载,比如System,String核心类等。在JDK中JRE的lib目录下rt.jar文件中
Extension ClassLoader 扩展类加载器
作用:负责JRE的扩展目录中jar包的加载,在JDK中JRE的lib目录下ext目录
Sysetm ClassLoader 系统类加载器
作用:负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径,主要是加载自定类
相关链接:点击打开链接
例1 Student类是自定义
package classLoader;
public class ClassLoadDemo {
public static void main(String[] args) throws ClassNotFoundException {
//(1)获取系统类加载器--AppClassLoader
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);
//(2)获取父类的类加载器--ExtClassLoader---核心类加载器
ClassLoader parentClassLoader = systemClassLoader.getParent();
System.out.println(parentClassLoader);
//(3)获取祖父类的类载器--Bootstrap ClassLoader--根(引导)类加载器
ClassLoader fatherparentClassLoader = parentClassLoader.getParent();
System.out.println(fatherparentClassLoader);
//结果:null---无法直接获取
//(4)重点---有助于代理模式的理解
Student student = new Student();
Class<? extends Student> clazz = student.getClass();
ClassLoader classLoader = clazz.getClassLoader();//看看Student使用时是谁加载的
System.out.println(classLoader);
//结果说明:自定义的类是由系统类加载加载的
//(5)系统类--Object和String
Class<?> clazz1 = Class.forName("java.lang.Object");
System.out.println(clazz1.getClassLoader());
//结果说明:null---无法直接获取系统类加载器
}
}
4、类加载器的作用 ---重点掌握
其中的一个方法:
public InputStream getResourceAsStream(String name)
说明:通过资源名称,通过输入流读取资源,如果无法找到资源,则返回 null
链接:点击打开链接
getResource()用法:点击打开链接
实际应用:要获取src某个包下的资源(比如说配置文件),而非当前项目下。可以通过如下的方式获取
补充:如果当前项目下获取自愿的方式,直接通过FileInputStream流的方式获取文件的内容
例2
package classLoader;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class UseClassLoader {
public static void main(String[] args) throws IOException {
//读取当前项目下的文件
//读取某个包下的文件
new UseClassLoader().load();
}
private void load() throws IOException {
ClassLoader classLoader = this.getClass().getClassLoader();
InputStream in = classLoader.getResourceAsStream("classLoader\\resource.properties");
Properties properties = new Properties();
properties.load(in);//加载
String username = properties.getProperty("username");
System.out.println(username);
String password = properties.getProperty("password");
System.out.println(password);
}
}
未完待续。。。