1. 程式人生 > >獲取Class位元組碼物件的三種方式

獲取Class位元組碼物件的三種方式

每個類被載入之後,系統就會為該類生成一個對應的位元組碼物件,通過該位元組碼物件就可以訪問到JVM中的對應的類。在Java中獲得Class物件通常有三種方式。

方式一,使用類的class屬性:

Class<java.util.Date> clz1 = java.util.Date.class;

方式二,通過Class類中的靜態方法forName(String className),傳入類的全限定名(必須新增完整包名)

Class<?> clz2 = Class.forName(“java.util.Date”);

方式三,通過物件的getClass方法來實現,其中,getClass()

Object類中的方法,所有的物件都可以呼叫該方法

java.util.Date str = new java.util.Date();

Class<?> clz3 = str.getClass();

第一種方式和第二種方式都是直接根據類來獲取位元組碼物件,相比之下,第一種方式更加安全,因為在編譯時期就可以檢查要訪問的Class物件是否存在,同時不用呼叫方法,效能也更好,因此用第一種方式比較多。但是如果只能獲得一個字串,如”java.lang.String”,就只能用第二種方式,第二種方式可能會丟擲ClassNotFoundException異常。

注意:同一個類在JVM

中只存在一份位元組碼物件,也就說上述,claz1 == clz2 == clz3;


在上述講了三種獲取Class物件的方式,基本資料型別不能表示為物件,也就不能使用getClass的方式,基本型別沒有類名的概念,也不能使用Class.forName的方式,如何表示基本型別的位元組碼物件呢?

實際上,所有的資料型別都有class屬性.因此可以用class屬性來表示:

                  Class  clz = 資料型別.class;

九大內建Class例項:  

JVM中預先提供好的Class例項byte,short,int,long,float,double,boolean,char,void.

表示為:byte.class,short.class,int.class,....void.class.

另外,在8大基本資料型別的包裝類中,都有一個常量:TYPE,用於返回該包裝類對應基本類的位元組碼物件.因此,Integer.TYPE == int.class,但是注意,Integerint是不同的資料型別

基本資料型別的Class例項可以用上面的方式,那麼陣列的Class例項又可以怎麼表示呢?很簡單,可以通過class屬性,也可以通過物件.getClass()方式。

陣列的Class例項:陣列是引用資料型別,陣列其實是物件.

如何來表示陣列的Class例項.

    方式1:  陣列型別.class;

    方式2:  陣列物件.getClass();

注意:所有的具有相同的維數和相同元素型別的陣列共享同一份位元組碼物件,和元素沒有關係.