java反射机制(3)- 动态类加载与重载(Load and Reload)

本文详细介绍了Java中的类加载器、层次结构,以及动态类加载和重载的概念。类加载器按照Bootstrap Loader -> ExtClassLoader -> AppClassLoader的委托模型工作。动态类加载可以通过类加载器的loadClass()方法实现,而动态类重载则需要自定义ClassLoader子类,并解决类的唯一标识问题。在设计类重载时,建议使用接口或超类来避免类型转换错误。
摘要由CSDN通过智能技术生成

1 类加载器 The ClassLoader

  Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由JVM中的类装载器Class Loader完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 。
  当一个类完成加载时,所涉及的类也都会被加载。类加载过程是一个递归的模式。但并不一定是一个应用里面所有类都会被加载,与这个被加载类的引用链无关的类是不会被加载的,直到有引用关系的时候它们才会被加载。比如函数中涉及的类,只有在函数被调用时才会加载。

2 类加载器的层次结构 The ClassLoader Hierarchy

  java中的类大致分为三种:
1. 系统类
2. 扩展类
3. 由程序员自定义的类
  
  类加载方式,有两种 :
1. 隐式加载, 程序在运行过程中当碰到通过new 方式生成对象时,隐式调用类装载器加载对应的类到jvm中;
2. 显式加载, 通过class.forname()等方法,显式加载需要的类 。即反射机制。


   JVM中类加载器的层次结构如下:
   Bootstrap Loader - 负责加载系统类
     |
     - - ExtClassLoader - 负责加载扩展类
      |
       - - AppClassLoader - 负责加载应用类

   java采用了委托模型机制,这个机制简单来讲,就是“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,如果Parent 找不到,那么才由自己依照自己的搜索路径搜索类”。类加载是一个Hierarchy递归的过程。类加载器加载类的顺序如下:
  
1. 检查这个类是否已经被加载。
2. 如果没有被加载,则首先调用父加载器加载。
3. 如果父加载器不能加载这个类,则尝试调用该类的加载器加载这个类。

当你实现一个有重载类功能的类加载器,它的顺序与上述会有些不同。类重载不会请求的他的父加载器来进行加载。在后面的段落会进行讲解。

3 动态类加载 Dynamic Class Loading

  动态加载一个类很简单。要做的就是获取该类的加载器ClassLoader然后调用它的loadClass()方法。

package com.markliu.reflection.classloader;

public class ClassloaderTest {

    public static void main(String[] args) {
        ClassLoader classLoader = ClassloaderTest.class.getClassLoader();
        try {
            Class<?> aClass = classLoader.loadClass("com.markliu.reflection.classloader.ClassloaderTest");
            System.out.println("aClass.getName() = " + aClass.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunny Mornings

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值