在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....