2020-12-31

获取Class对象的引用

  1. 通过Class.forName("str")方法。在传递给forName()的字符串中,必须使用完全限定名(包名.类名)。
  2. 通过类字面常量生成对Class对象的引用如:Student.class。类字面常量除应用于普通类,还可以应用于接口数组以及基本数据类型。这种方法在编译时就会受到检查,且根除了forName()方法的调用
  3. 若已拥有一个类型的对象,通过getClass()方法获取Class引用。

本文介绍通过类字面常量生成对Class对象的引用。

package typeinfo14_2_1;

import java.util.Random;

public class ClassInitialization {
	public static Random rand = new Random(47);

	public static void main(String[] args) throws ClassNotFoundException {
		
		//仅使用.class 语法获得对类的引用不会引发初始化
		Class initable = Initable.class;
		
		//static final + 编译期常量:不需要对类初始化即可被读取
		System.out.println(Initable.staticFinal);
		
		//static final:将强制进行初始化
		System.out.println(Initable.staticFinal2);
		
		//访问static域之前,要先为这个域分配存储空间,并初始化该存储空间
		System.out.println(Initable2.staticNonFinal);
		
		//为产生Class引用,Class.forName()立即就进行了初始化
		Class initable3 = Class.forName("typeinfo14_2_1.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");
	}
}

 打印结果:

47
Initializing Initable
258
Initializing Initable2
147
Initializing Initable3
After creating Initable3 ref
74

 

你可能感兴趣的:(java)