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);
// null
System.out.println(parent.getParent());
}
}
由于最后一层希望获取的是引导类加载器(C++),Java 无法获取,故返回
null
。
// AppClassLoader
System.out.println(Class.forName("com.lht.reflection.TestClassLoader").getClassLoader());
// null
System.out.println(Class.forName("java.lang.Object").getClassLoader());
可以看出,
java.lang.Object
是系统核心库,由引导类加载器进行加载。