Classの取得方法

2015 ワード

Classオブジェクトは、クラスのすべての一般オブジェクトを作成するために使用されます.各クラスはクラスオブジェクトに対応しています(.classファイルに保存されています).
すべてのクラスは、最初の使用時にJVMに動的にロードされます.クラスのクラスオブジェクトがメモリにロードされると、そのクラスのすべてのオブジェクトを作成するために使用されます.
Classオブジェクトを取得する方法は2つあります
一:Class.forName(「パッケージ名.クラス名」);
二:クラス名class;(クラス文字定数)
2つ目の方法は、forNameメソッドを呼び出す必要がないため、より効率的であるため、より簡単で安全です(コンパイル時にチェックを受けます).
第2の方法を使用してClassオブジェクトの参照を作成する場合、そのClassオブジェクトは自動的に初期化されません.
次のコードを見てください.
    
package com.test;

import java.util.Random;

public class Candy {

	public static Random rand = new Random(47);
	public static final int num1 = 1;
	public static final int num2 = rand.nextInt(1000);
	
	static {
		System.out.println("loading candy");
	}
	
	public static void staticMethod(){
		System.out.println("-------staticMethod--------");
	}

	
}
package com.test;

public class Test {

	public static void main(String args[]) {
		/****** Class.forName() ********/
//		try {
//			Class c1 = Class.forName("com.test.Candy");
//			System.out.println("get Class by Class.forName()");
//		} catch (ClassNotFoundException e) {
//			e.printStackTrace();
//		}
		
		
		
		/****Candy.class****/
		
		Class c2 = Candy.class;
		System.out.println("get Class by Candy.Class");
		System.out.println("num--->"+Candy.num1);
		System.out.println("---------------------");
		
//		System.out.println("random num ---->"+Candy.num2);
		System.out.println("num is not final --->"+Candy.num3);

	}
}

第1の方法を実行すると、出力情報は以下のようになる.
loading candy
get Class by Class.forName()
は、Classオブジェクトを取得する際に初期化が行われていることがわかる.
第2の方法を採用する場合、入力情報は以下の通りである.
get Class by Candy.Class
num--->1
---------------------
loading candy
random num ---->258

初期化が遅延され、初期化は、静的メソッド(コンストラクタが暗黙的に静的である)を呼び出したり、非常数の静的ドメイン(コンパイル期間定数ではない)を最初に参照したり、final以外の静的ドメインを参照したりするときに行われます.