天天看點

Java反射之Class類

在java中可以用類來表示具有共性的一類事物,如我們可以用Person類來表示衆多的人,同樣的問題是我們用什麼類來表示衆多的java類呢?實際上,在Java程式中的各個Java類屬于同一類事物,描述這類事物的Java類名就是Class。

java.lang.Class 是一個比較特殊的類,它用于封裝已經被加載到JVM中的類(包括類和接口)的資訊。即當一個類或接口被裝入JVM時便會産生一個與之關聯的java.lang.Class對象可以通過這個Class對象來對類的詳細資訊進行通路。

Person類代表人,它的執行個體可以是張三、李四這樣一個個具體的人,那麼Class類代表Java類,它的執行個體對象表示什麼呢?

     ---->Class的執行個體對象代表的是對應的各個類在記憶體中的位元組碼,例如:Person類的位元組碼,String類的位元組碼...

     ---->一個類被類加載器加載到記憶體中,占用一片存儲空間,這個空間裡面的内容就是類的位元組碼,不同的類有不同的位元組碼。

同樣的,和普通類一樣,Class類也描述了一些資訊,如:類的名字,類的通路屬性,類所屬包的名字,字段名的清單,方法名的清單,等等....

如何得到位元組碼對應的執行個體對象呢?(Class類型)

1: 類名.class 例如::String.class 【傳回String類對應的位元組碼】

2:對象.getClass() 例如:new Date().getClass() 【傳回Date類對應的位元組碼】

3:Class.forName("類全名"); 例如:Class.forName("java.util.Date"); 【傳回Date對應的位元組碼,這個方法常用】

執行個體代碼:

public class ReflectTest1 {

	public static void main(String[] args) throws ClassNotFoundException {
		
		String str = "廖澤民";
		
		/*對象.getClass()擷取類的位元組碼*/
		Class clas1 = str.getClass();
		
		/*類.class擷取類的位元組碼*/
		Class clas2 = String.class;
		
		/*Class.forName("類名");擷取類的位元組碼*/
		Class clas3 = Class.forName("java.lang.String");
		
		/*判斷這三份位元組碼是否相同--->結果為true*/
		System.out.println(clas1 == clas2);
		/*--->結果為true*/
		System.out.println(clas2 == clas3);
		
		/*判斷是否屬于原生态類型【基本類型】位元組碼--->結果為false*/
		System.out.println(clas1.isPrimitive());
		
		/*判斷int類型和Integer類型的位元組碼是否相同--->結果為false*/
		System.out.println(int.class == Integer.class);
		
		/*Integer.TYPE擷取的是Integer對應的基本類型--->結果為true*/
		System.out.println(int.class == Integer.TYPE);
	}
}
           

九個預定義的Class執行個體對象:

boolean.class

byte.class

char.class

short.class

int.class

long.class

float.class

double.class

void.class

注:隻要是在源程式中出現的類型,都有各自的Class執行個體對象,例如:int[](數組類型不是基本類型),void....