反射之类加载器

类加载器

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

猜你喜欢

转载自blog.csdn.net/wzj_110/article/details/80246613