文章目录

  • 1:动态和静态加载
  • 2:类加载的过程


接下来跟大家说一下类加载,类加载就是我们把编译阶段生成的字节码通过类加载器生成到运行时数据区中的堆里面和在方法区中生成字节码二进制数据,接下来我们就讲一下类加载的过程

java lib 动态加载 java静态加载和动态加载_java lib 动态加载

1:动态和静态加载

  • 基本说明

反射机制是Java实现动态语言的关键,也就是通过反射实现类动态加载。

1.静态加载:编译时加载相关的类,如果没有则报错,依赖性太强

2.动态加载:运行时加载需要的类,如果运行时不用该类,即使不存在该类,则不报错,降低了依赖性

静态加载案例演示:我们如果写在idea里面,一出错马上就提示了,我们很难感受到静态加载和动态加载的效果。我们就选择使用原生态的方式,通过javac,java来演示
在记事本中编写如下代码,然后执行javac ClassLoader_.java命令

import java.util.Scanner;
public class ClassLoader_ {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入key");
        String key = scanner.next();
        switch (key){
            case "1":
               Dog dog= new Dog();
               dog.hi();;
               break;
            case "2":
                System.out.println("ok");
                break;
             default:
                System.out.println("do nothing..");    
        }
    }
}

java lib 动态加载 java静态加载和动态加载_类加载_02


解释:如上就体现了静态加载(编译时加载相关的类,如果没有则报错,依赖性太强),我们输入值的时候,如果输入的不是1,我们就可以不需要加载Dog类(在运行过程中,Dog类不一定会用到),但是在编译的时候就会加载相关的类,如果没有则报错,依赖性太强。

动态加载案例演示:在记事本中编写如下代码,然后执行javac ClassLoader_.java命令

import java.util.Scanner;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ClassLoader_ {
    public static void main(String[] args) throws Exception{
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入key");
        String key = scanner.next();
        switch (key){
            case "1":
    //           Dog dog= new Dog();
       //        dog.hi();;
               break;
            case "2":
               Class<?> cls = Class.forName("com.reflection.People");
                Object o = cls.newInstance();
                Method hi = cls.getMethod("hi");
                hi.invoke(o);
                break;
           default:
                System.out.println("do nothing..");
        }
    }
}

java lib 动态加载 java静态加载和动态加载_反射_03


解释:运行时加载需要的类,如果运行时不用该类,即使不存在该类,则不报错,降低了依赖性。我们如果运行该程序,输入一个2值,观察会发生什么

java lib 动态加载 java静态加载和动态加载_静态加载_04


如上报了一个错java.lang.ClassNotFoundException,为什么呢?因为Person类是动态加载,所以,没有编写Person类也不会报错(javac),只有当动态加载该类时,才会报错(java)

  • 类加载时机

1.当创建对象时(new)
2.当子类被加载时
3.调用类中的静态成员时
4.通过反射
1,2,3是静态加载 4是动态加载

2:类加载的过程

此章节已经在

深入理解Java虚拟机——类的加载过程(类的生命周期) 介绍过,在此不在详细介绍,给大家整理一个流程图,加深印象

java lib 动态加载 java静态加载和动态加载_类加载_05