反射(分析类初始化)

什么时候会发生类初始化:
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

原文地址:https://www.cnblogs.com/YXBLOGXYY/p/14645337.html