Java反射——类加载——第三章

本文将深入解析Java反射中的动态加载与静态加载的区别,通过实战演示类加载过程,并介绍类加载时机。了解类加载的生命周期和常见场景,提升对动态语言实现的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java反射——反射机制问题——第一章
Java反射——Class类——第二章
Java反射——类加载——第三章
Java反射——反射获取类的结构信息——第四章

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

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..");    
        }
    }
}

在这里插入图片描述
解释:如上就体现了静态加载(编译时加载相关的类,如果没有则报错,依赖性太强),我们输入值的时候,如果输入的不是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..");
        }
    }
}

在这里插入图片描述
解释:运行时加载需要的类,如果运行时不用该类,即使不存在该类,则不报错,降低了依赖性。我们如果运行该程序,输入一个2值,观察会发生什么
在这里插入图片描述
如上报了一个错java.lang.ClassNotFoundException,为什么呢?因为Person类是动态加载,所以,没有编写Person类也不会报错(javac),只有当动态加载该类时,才会报错(java)

  • 类加载时机

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

2:类加载的过程

此章节已经在
深入理解Java虚拟机——类的加载过程(类的生命周期)
介绍过,在此不在详细介绍,给大家整理一个流程图,加深印象
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值