刚好看到了think in java的第14章 class和反射,看到个demo很有意思。
具体讲:
当".class"来创建对Class对象的引用时,不会自动地初始化该Class对象,
同时包含了3个步骤
1、加载
2、链接
3、初始化,如果该类具有超类,则对其进行初始化,执行静态初始化器和静态初始化块
初始化被延迟到了对静态方法或者非常数静态域进行首次引用时才执行
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package
jdk.reflect;
import java.util.Random;
/**
* @author <a href="mailto:czy88840616@gmail.com">czy</a>
* @since 2010-4-25 21:11:02
*/
public class ClassInitialization {
public static Random rand = new Random( 47 );
public static void main(String[] args) throws ClassNotFoundException {
// 在使用.class创建对Class的引用的时候,不会自动初始化Class对象,所以不会触发static块
Class initable = Initable. class ;
System.out.println( " after creating Initable ref " );
// 调用了类的常数静态域,所以不会触发static块
System.out.println(Initable.staticFinal);
// 调用了非常数静态域,会触发static块
System.out.println(Initable.staticFinal2);
// 没有fianl
System.out.println(Initable2.staticNonFinal);
// class.forname会触发初始化
Class initable3 = Class.forName( " jdk.reflect.Initable3 " );
System.out.println( " after creating initable3 ref " );
System.out.println(Initable3.staticNonFinal);
}
}
class Initable {
static final int staticFinal = 47 ;
static final int staticFinal2 = ClassInitialization.rand.nextInt( 1000 );
static {
System.out.println( " Initializing Initable " );
}
}
class Initable2 {
static int staticNonFinal = 147 ;
static {
System.out.println( " Initializing Initable2 " );
}
}
class Initable3 {
static int staticNonFinal = 74 ;
static {
System.out.println( " Initializing Initable3 " );
}
}
import java.util.Random;
/**
* @author <a href="mailto:czy88840616@gmail.com">czy</a>
* @since 2010-4-25 21:11:02
*/
public class ClassInitialization {
public static Random rand = new Random( 47 );
public static void main(String[] args) throws ClassNotFoundException {
// 在使用.class创建对Class的引用的时候,不会自动初始化Class对象,所以不会触发static块
Class initable = Initable. class ;
System.out.println( " after creating Initable ref " );
// 调用了类的常数静态域,所以不会触发static块
System.out.println(Initable.staticFinal);
// 调用了非常数静态域,会触发static块
System.out.println(Initable.staticFinal2);
// 没有fianl
System.out.println(Initable2.staticNonFinal);
// class.forname会触发初始化
Class initable3 = Class.forName( " jdk.reflect.Initable3 " );
System.out.println( " after creating initable3 ref " );
System.out.println(Initable3.staticNonFinal);
}
}
class Initable {
static final int staticFinal = 47 ;
static final int staticFinal2 = ClassInitialization.rand.nextInt( 1000 );
static {
System.out.println( " Initializing Initable " );
}
}
class Initable2 {
static int staticNonFinal = 147 ;
static {
System.out.println( " Initializing Initable2 " );
}
}
class Initable3 {
static int staticNonFinal = 74 ;
static {
System.out.println( " Initializing Initable3 " );
}
}
结果:
after creating Initable ref
47
Initializing Initable
258
Initializing Initable2
147
Initializing Initable3
after creating initable3 ref
74
47
Initializing Initable
258
Initializing Initable2
147
Initializing Initable3
after creating initable3 ref
74