类加载
【摘要】 类加载介绍反射机制是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)