1 内存分析
Java 内存
类加载与 ClassLoader

public class TestMemory {public static void main(String[] args) {Dummy dummy = new Dummy();System.out.println(Dummy.a);}}class Dummy {static {System.out.println("Static code block...");a = 300;}static int a = 100;public Dummy() {System.out.println("Constructor...");}}
Static code block...Constructor...100
由于在类初始化过程中<clinit>()方法将静态代码块和静态变量赋值代码进行了合并,合并之后长这个样:
<clinit>() {System.out.println("Static code block...");a = 300;a = 100;}
所以输出Dummy.a的值为 100 而不是 300。
2 类初始化过程

3 类加载器 ClassLoader


package com.lht.reflection;public class TestClassLoader {public static void main(String[] args) {// Application classloader.ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();System.out.println(systemClassLoader);// Extension classloader.ClassLoader parent = systemClassLoader.getParent();System.out.println(parent);// nullSystem.out.println(parent.getParent());}}
由于最后一层希望获取的是引导类加载器(C++),Java 无法获取,故返回
null。
// AppClassLoaderSystem.out.println(Class.forName("com.lht.reflection.TestClassLoader").getClassLoader());// nullSystem.out.println(Class.forName("java.lang.Object").getClassLoader());
可以看出,
java.lang.Object是系统核心库,由引导类加载器进行加载。
