类的加载细节探索

 1 public class TestClassLoader1 {
 2     public static void main(String[] args) {
 3 
 4         Test test = new Test();
 5     }
 6 }
 7 class Test{
 8 
 9     static{
10         m=200;
11     }
12 
13     static int m=100;
14     static{
15         m=250;
16         System.out.println(m);
17         System.out.println("静态代码块执行完毕。");
18     }
19 
20     public Test(){
21         m=400;
22         System.out.println(m);
23         System.out.println("构造方法。");
24     }
25 }

1.创建一个对象有三个阶段:加载,链接,初始化。以上示例说明:静态变量在加载的时候被加载进内存,链接时给静态变量赋初始值为0,在初始化阶段有JVM调用clinit()方法来按顺序合并静态代码块。

2.测试什么情况下类会被加载:new 对象;调用父类的静态变量;

 1 public class Test3 {
 2     public static void main(String[] args) throws ClassNotFoundException {
 3         //1.主动加载
 4         Son son = new Son();
 5 
 6         //2.通过子类引用父类的静态变量,会让父类加载
 7         System.out.println(Son.a);
 8 
 9         //3.Class.forName()方法让子类加载
10         Class c = Class.forName("TestMyself.Son");
11 
12         //4.定义数组,类不会被加载
13         Son[] sons=new Son[3];
14 
15         //5.调用静态常量类也不会被加载
16         System.out.println(Son.c);
17     }
18 }
19 class Father{
20     static int a=100;
21     static{
22         System.out.println("Father 静态代码块");
23     }
24 }
25 
26 class Son extends Father{
27     static int b=200;
28     static final int c=300;
29     static{
30         System.out.println("Son 静态代码块");
31     }
32 }

3.获得类加载器:

主要方法:

classLaoder.getSystemClassLoader():获得系统类加载器;

getParent():获得父类加载器;

 1 //获得类加载器--->Class.getClassLoader():Class对象获得类加载器
 2 public class Test4 {
 3     public static void main(String[] args) throws ClassNotFoundException {
 4         //系统类加载器:-->加载用户定义的类
 5         ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
 6         System.out.println(systemClassLoader);
 7 
 8         //扩展类加载器:-->加载扩展类
 9         ClassLoader parent = systemClassLoader.getParent();
10         System.out.println(parent);
11 
12         //根加载器:--->加载核心类(用c/c++编写):
13         ClassLoader parent1 = parent.getParent();
14         System.out.println(parent1);
15 
16         ClassLoader classLoader = Class.forName("java.lang.String").getClassLoader();
17     }
18 }
原文地址:https://www.cnblogs.com/xbfchder/p/11013323.html