獲取Class實例
import java.util.Date;
//獲取字節(jié)碼對象(Class對象)
public class GetClassInstance {
public static void main(String[] args) throws Exception {
//需求:獲取java.util.Date類的字節(jié)碼對象
// 方式一:使用class屬性
Class<java.util.Date> clz1 = java.util.Date.class;
// 方式二:通過對象的getClass方法來獲取肥印,getClass是Object類中的方法;返回次Object的運行時類
java.util.Date date = new java.util.Date();
Class<?> clz2 = date.getClass();
// 方式三:通過Class類中的靜態(tài)方法forName(String className);
Class clz3 =Class.forName("java.util.Date");
System.out.println(clz1);
System.out.println(clz2);
System.out.println(clz3);
System.out.println(clz1 == clz2);
System.out.println(clz1 == clz3);
System.out.println(clz3 == clz2);
/*Console:
class java.util.Date
class java.util.Date
class java.util.Date
true
true
true
*/
}
}
第三種使用最多柱宦,框架中大量使用熬丧;
九大內(nèi)置的Class實例
思考一個問題:
在前面講述了三種獲取Class對象的方式舵鳞,基本數(shù)據(jù)類型不能表示為對象(注意:包裝類包裝的是值),也就不能使用getClass()的方式狡孔,基本類型沒有類名的概念懂诗,也就無法使用Class.forName()的方式,如何表示基本類型的字節(jié)碼對象呢苗膝?
所有的數(shù)據(jù)類型都有class屬性殃恒,其語法為:
Class clz = 數(shù)據(jù)類型.class ;
九大內(nèi)置Class實例:
-JVM預(yù)先提供好的Class實例,分別為:
byte,short,int,long,float,double,char,boolean,void辱揭;
注意這里的void也是屬于基本類的离唐。
在八大基本數(shù)據(jù)類型的包裝類中,都有一個常量 :TYPE问窃;用于返回該包裝類對應(yīng)基本類的字節(jié)碼對象;
System.out.println(Integer.TYPE == int.class);//true
注意:Integer和int是不同的數(shù)據(jù)類型
對System類中的identityHashCode()簡單說明一下:
一個對象的identityHashCode能夠始終和該對象的內(nèi)部地址有一個相對應(yīng)的關(guān)系亥鬓,從這個角度來講,它可以用于代表對象的引用地址域庇。
public class IntClasses {
public static void main(String[] args) {
Class<Integer> a = int.class;
Class<Integer> b = Integer.TYPE;
Class<Integer> c = Integer.class;
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(b));
System.out.println(System.identityHashCode(c));
}
}
示例輸出(每次都是不同的嵌戈,但前兩個總是相同的,第三個實際上總是不同的,因為是JVM內(nèi)置的):
1627674070
1627674070
1360875712
數(shù)組的Class實例
數(shù)組是引用數(shù)據(jù)類型较剃,數(shù)組其實是對象咕别;
-在Object類中開頭有說明:
/*
Class {@code Object} is the root of the class hierarchy(等級體系 ).
- Every class has {@code Object} as a superclass. All objects,
- including arrays, implement the methods of this class.
*/
--接口是一種特殊的類,也可以調(diào)用Object類中的方法写穴;
如何表示數(shù)組的Class實例:
int[] arr1 = {1,2,3};
//方式一:數(shù)組類型.class;
Class<int[]> arr1Class = int[].class
//方式二:數(shù)組對象.getClass();
Class<int[]> arr2Class = arr.getClass();
System.out.println(arr1Class == arr2Class);
//true -比較的是否為同一份字節(jié)碼惰拱;
//*注意:所有具有相同的維度和相同元素類型的數(shù)組共享同一份字節(jié)碼對象,和元素沒有關(guān)系啊送!
//-Object類中有說明偿短;
即:int[] arr2 = {4,5,6,7,8,9};
System.out.println(arr1.getClass() == arr2.getClass());//true
Class與Object的區(qū)別
Class:描述所有的類型,所以在Class類中應(yīng)該具有所有類型的相同方法馋没;
Object:描述所有的對象昔逗,所以在Object類用應(yīng)該具有所有對象的共同的方法;