package com.uno.staticBlock;
import java.lang.reflect.Field;
import java.util.Vector;
/**
* 验证静态代码块和构造代码块执行顺序
*
* 1.加载父类静态代码块
* 2.加载子类静态代码块
* 3.加载父类构造代码块
* 4.父类构造方法
* 5.子类构造代码块
* 6.子类构造方法
* @author uno
*
*/
public class StaticBlock {
//1.加载MyClass时,不一定会执行static代码块
static ClassLoader loader = Thread.currentThread().getContextClassLoader();
public static void main(String[] args) {
printClassesOfClassLoader(loader);
//testClassLoader();
new SON();
printClassesOfClassLoader(loader);
}
/**
* 测试静态代码块是否执行
*
* 2017年11月20日
* author: leipan
*/
public static void testClassLoader(){
//System.out.println("此方法加载class后不会执行static代码块," + MyClass.class + ",但会加载到ClassLoader中。");
}
public static void printClassesOfClassLoader(ClassLoader loader){
try {
Field classesF = ClassLoader.class.getDeclaredField("classes");
classesF.setAccessible(true);
Vector> classes = (Vector>) classesF.get(loader);
for(Class c : classes) {
System.out.println(c);
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
class Father {
static {
System.out.println("Father static exec。");
}
{
System.out.println("Father unstatic exec。");
}
public Father (){
System.out.println("Father Construction。");
}
}
class SON extends Father{
static {
System.out.println("myClass static exec。");
}
{
System.out.println("myClass unstatic exec。");
}
public SON (){
System.out.println("Son construction。");
}
}
结果:
class com.uno.staticBlock.StaticBlock
Father static exec。
myClass static exec。
Father unstatic exec。
Father Construction。
myClass unstatic exec。
Son construction。
class com.uno.staticBlock.StaticBlock
class com.uno.staticBlock.Father
class com.uno.staticBlock.SON