文章目录
  1. 1. Class类型引用获取方式
  2. 2. 类字面常量说明

Class类型引用获取方式

无论何时,只要你想在运行时使用类型信息,就必须首先获得对恰当的Class对象的引用;

Class.forName();

通过实例对象的getClass();

类字面常量:Initable.class;

类字面常量说明

类字面常量不会自动初始化该Class对象。为了使用类需要做的准备工作包括以下3个方面:

- 加载 由类加载器执行

- 链接 验证字节码,为静态域分配空间,并且如果必须的话,将解析这个类创建的对其他类的所有引用

- 初始化 如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。
初始化被延迟到了对静态方法(构造器隐式地是静态的)或者非常数静态域进行首先引用时才执行

类字面常量初始化有效的实现了尽可能的“惰性”。详见代码:

仅使用.class来获取类的引用时不会引发初始化;但Class.forName()却立即进行了初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import java.util.Random;
class Initable{
static final int staticFinal = 47;
static final int staticFinal2 = ClassInitialization.rand.nextInt(1000);// the value is between 0 and 1000 which is returned ;
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");
}
}
public class ClassInitialization{
public static Random rand = new Random(47);// Random(long seed);
public static void main (String[] args) throws Exception{
Class initable = Initable.class; //不会引发类初始化;
splitLine("Initable");
System.out.println(Initable.staticFinal);//编译期常量,不需对Initable类进行初始化就可以读取
//splitLine();
System.out.println(Initable.staticFinal2);//非编译期常量,强制对Initable类进行初始化
splitLine(null);
System.out.println(Initable2.staticNonFinal);
//访问一个非final的static域,在读取之前,要求先进行链接(为这个域分配存储空间)和初始化(初始化该存储空间)
splitLine("Initable2");
Class initable3 = Class.forName("Initable3");
splitLine("Initable3");
System.out.println(Initable3.staticNonFinal);
}
public static void splitLine(String desc){
if(null!= desc) System.out.println("After creating "+desc+" ref");
System.out.println("------------------------------------");
}
/*
* output:
*
* After creating Initable ref
* ------------------------------------
* 47
* Initializing Initable
* 258
* ------------------------------------
* Initializing Initable2
* 147
* After creating Initable2 ref
* ------------------------------------
* Initializing Initable3
* After creating Initable3 ref
* ------------------------------------
* 74
*/
}

参考资料:Thinking in Java

文章目录
  1. 1. Class类型引用获取方式
  2. 2. 类字面常量说明