反射(分析类初始化)

什么时候会发生类初始化:
1)new的时候

2)使用反射的时候

3)当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类

测试:

复制代码
 1 package reflection;
 2 
 3 
 4 import org.w3c.dom.ls.LSOutput;
 5 
 6 import java.nio.file.FileSystemAlreadyExistsException;
 7 
 8 // 测试类声明时候会初始化
 9 public class Test06 {
10     static {
11         System.out.println("Main类被加载");
12     }
13     public static void main(String[] args) {
14         Son son = new Son();
15     }
16     
17 }
18 
19 class Father {
20     static  int b = 2;
21     static {
22         System.out.println("父类被加载");
23     }
24 }
25 
26 class Son extends Father {
27     static {
28         System.out.println("子类被加载");
29         m = 300;
30     }
31 
32     static int m = 100;
33     static final int M = 1;
34 }
复制代码

结果:

Main类被加载
父类被加载
子类被加载

1  Class.forName("reflection.Son");

结果:

Main类被加载
父类被加载
子类被加载

 

 

 

 

 

不会发生类初始化情况:

1)子类去调用父类的静态变量,不会导致子类初始化

1  System.out.println(Son.b);

结果:

Main类被加载
父类被加载
2

 

2)通过数组定义类引用,不会触发此类的初始化

1    Son[] sons = new Son[5];

结果:

Main类被加载

 

3)引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)

1  System.out.println(Son.M);

结果:

Main类被加载
1

 

posted on   Love&Share  阅读(143)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示