类加载

举报
荞慧子 发表于 2022/12/31 19:56:13 2022/12/31
【摘要】 类加载介绍反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载。(1)静态加载:编译时加载相关的类,如果没有则报错,依赖性太强。(2)动态加载:运行时加载需要的类,如果运行时不用该类,既是不存在该类,则不报错,降低了依赖性。类加载时机(1)当创建对象时 //静态加载(2)当子类被加载时,父类也加载 //静态加载(3)调用类中的静态成员时 //静态加载(4)通过反射 //动态加载...

类加载

介绍

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

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

(2)动态加载:运行时加载需要的类,如果运行时不用该类,既是不存在该类,则不报错,降低了依赖性。

类加载时机

(1)当创建对象时 //静态加载

(2)当子类被加载时,父类也加载 //静态加载

(3)调用类中的静态成员时 //静态加载

(4)通过反射 //动态加载

加载阶段

JVM在该阶段的主要目的是将字节码从不同的数据源(可能是class文件,也可能是jar包,甚至是网络)转化为二进制字节流加载到内存中,并生成一个代表该类的java.lang.Class对象

连接阶段-验证

(1)目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

(2)包括文件格式验证、元数据验证、字节码验证和符号引用验证。

(3)可以考虑使用 -Xverify:none 参数来关闭大部分的类验证措施,缩短虚拟机类加载的时间

连接阶段-准备

JVM会在该阶段对静态变量,分配内存并默认初始化(对应数据类型的默认初始化值,如0、0L、null、false等)。这些变量所使用的内存都将在方法区中进行分配。

举例

public class ClassLoad02 {
    public static void main(String[] args) {
    
    }
}

class A {
    //属性-成员变量-字段
    //分析类加载的链接阶段-准备 属性是如何处理
    //1. n1 是实例属性, 不是静态变量,因此在准备阶段,是不会分配内存
    //2. n2 是静态变量,分配内存 n2 是默认初始化 0 ,而不是 20
    //3. n3 是 static final 是常量, 他和静态变量不一样, 因为一旦赋值就不变 n3 = 30
    public int n1 = 10;
    public static int n2 = 20;
    public static final int n3 = 30;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。