类加载器
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); } }未完待续。。。