博客
关于我
Java内存分析
阅读量:277 次
发布时间:2019-03-01

本文共 1675 字,大约阅读时间需要 5 分钟。

类的加载与ClassLoader的理解

类的加载是一个关键的概念,在Java运行时机制中起着重要作用。它涉及将class文件的字节码内容加载到内存中,并转换为JVM运行时的数据结构,生成代表类的Class对象。这个过程通常分为三个阶段:加载、链接和初始化。

加载阶段

加载阶段是将class文件字节码内容读取到内存中,并将其转换为JVM运行时的数据结构。具体来说,Java类文件的字节码被读取后,JVM会解析这些字节码,生成静态方法和静态字段的方法区内存结构。这个过程通常由类加载器(ClassLoader)负责,ClassLoader根据配置的类路径查找相应的class文件,并进行加载。

链接阶段

链接阶段是将Java类的二进制代码合并到JVM的运行状态之中。这一阶段的关键任务是确保所有被加载的类在JVM中是完整的,所有的依赖关系都被正确处理。具体来说,链接阶段包括两个子阶段:

  • 验证(Verification):确保class文件的字节码符合Java规范,没有语法错误。
  • 准备(Preparation):为类的静态变量分配内存,设置默认初始值。
  • 初始化阶段

    初始化阶段是执行类构造器(ClassInitializer)

    方法的过程。类构造器的方法是由编译器收集静态变量赋值和静态代码块的语句合并而成的。需要注意的是,静态代码块的执行顺序是基于它们在源文件中的位置决定的,且静态代码块中的变量只能在其定义前使用,不能在后使用。

    个人总结

    类的加载过程可以用三个阶段来描述:加载、链接和初始化。加载阶段是将class文件读入内存并解析成Class对象,链接阶段是确保类的完整性和一致性,初始化阶段则是执行类构造器,完成类变量的赋值和静态代码块的执行。

    什么时候会发生类的初始化?

    类的初始化通常发生在以下情况:

    主动引用

    • 当虚拟机启动时,首先初始化main方法所在的类。
    • new一个类的对象。
    • 调用类的静态成员(除final常量外)。
    • 使用java.lang.reflection包中的反射机制对类进行操作。
    • 初始化一个类时,若其父类未被初始化,则会先初始化父类。

    被动引用

    类的被动引用不会导致类的初始化:

    • 访问一个静态域时,只有真正声明该域的类才会被初始化。
    • 通过子类引用父类的静态变量不会导致子类初始化。
    • 定义数组时引用的类不会触发类的初始化。
    • 引用常量(如String、Integer等)不会触发类的初始化,因为常量在链接阶段已经被处理。

    类加载器(ClassLoader)

    类加载器是负责动态加载class文件的组件。它根据类路径(classpath)查找相应的class文件,并通过加载器的定义API进行操作。常见的类加载器包括:

    • 系统类加载器(Bootstrap ClassLoader)
    • 应用类加载器(Application ClassLoader)
    • 第三方类加载器(如Spring的ClassLoader)

    类加载器在类的加载过程中负责查找、读取和验证class文件,同时处理类之间的依赖关系。

    获取运行时类的完整结构

    为了获取一个类在运行时的完整结构,可以使用以下方法:

  • 使用类的getMethods()方法获取类的所有方法。
  • 使用ClassUtils工具类获取类的完整信息。
  • 使用反射机制获取类的属性和方法。
  • 这些方法可以帮助开发者全面了解类的结构和行为。

    用反射创建类的对象

    通过反射机制可以创建类的对象,常用的方式包括:

    无参构造

    Class
    clazz = Class.forName("com.example.MyClass");Object obj = clazz.newInstance();

    通过构造器构造

    Class
    clazz = Class.forName("com.example.MyClass");Constructor
    constructor = clazz.getConstructor();Object obj = constructor.newInstance();

    转载地址:http://cyfa.baihongyu.com/

    你可能感兴趣的文章
    Nginx 动静分离与负载均衡的实现
    查看>>
    Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
    查看>>
    nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
    查看>>
    Nginx 反向代理解决跨域问题
    查看>>
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    Nginx 常用配置清单
    查看>>
    nginx 常用配置记录
    查看>>
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>
    Nginx 负载均衡与权重配置解析
    查看>>
    Nginx 负载均衡详解
    查看>>
    nginx 配置 单页面应用的解决方案
    查看>>
    nginx 配置https(一)—— 自签名证书
    查看>>
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx 配置解析:从基础到高级应用指南
    查看>>
    nginx+Tomcat性能监控
    查看>>