反射機制(二)獲取Class實例的三種方式

獲取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預先提供好的Class實例,分別為:
byte,short,int,long,float,double,char,boolean,void;
注意這里的void也是屬于基本類的。


八大基本數(shù)據(jù)類型的包裝類中,都有一個常量 :TYPE;用于返回該包裝類對應基本類的字節(jié)碼對象;
System.out.println(Integer.TYPE == int.class);//true

注意:Integer和int是不同的數(shù)據(jù)類型

System類中的identityHashCode()簡單說明一下:
一個對象的identityHashCode能夠始終和該對象的內(nèi)部地址有一個相對應的關系,從這個角度來講,它可以用于代表對象的引用地址。

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é)碼對象,和元素沒有關系!
//-Object類中有說明;
即:int[] arr2 = {4,5,6,7,8,9};
System.out.println(arr1.getClass() == arr2.getClass());//true 

Class與Object的區(qū)別

Class:描述所有的類型,所以在Class類中應該具有所有類型的相同方法;
Object:描述所有的對象,所以在Object類用應該具有所有對象的共同的方法;

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,068評論 25 709
  • 夜,禁了月的光華;月,劃了夜的墳墓。 血色浸透了月,血色渲染了夜。暗紅的月色,裝飾了誰的窗沿? 多年前的,“我要與...
    長歌霧后閱讀 265評論 4 3
  • Python數(shù)據(jù)庫編程 ORM-SQLAlchemy學習 一、ORM背景介紹 如果寫程序用pymysql和程序交互...
    weizt閱讀 151評論 0 0
  • 一到過年,各種各樣的相親接踵而來,有一天相一個的,有一天相好幾個的,有朋友介紹的,有同事介紹的,有親戚介紹的,有鄰...
    情愛說閱讀 369評論 0 0

友情鏈接更多精彩內(nèi)容