JAVA 反射學習筆記

編譯類型和運行類型

Object obj = new Date();
編譯類型:Object
運行類型(obj對象真實的類型):Date

需求:

根據對象obj調用Date類中的一個方法
obj.toLocalString();
toLocalString 是Date中的方法。編譯的時候出錯
代碼在編譯階段去編譯類型Object中檢查該方法,若沒有,編譯失敗

解決方案:

強制轉換obj爲Date類型:
Date d = (Date)obj;
d.toLocalString();//yes
強制轉換:
前提:必須知道對象的真是類型是什麼?
若不知道obj的真實類型,那又如何調用toLocalString方法?

元數據:metadata

描述數據的描述數據

反射

    得到元數據的原型,得到元數據的行爲
    對象:數據 -》類:描述對象 :描述數據-》描述類的類:描述數據的描述數據
    class數對一切類共同功能行爲和狀態的抽象

class中有應該有類具備的成員
getPackage():表示類的包
getSuperClass():表示累的父類
getMethods():
getField():

通過反射,可以得到一個類中的包、類名、父類、字段、方法
但是前提,必須知道,你反射的是那一個類
得到某一個類中的所有成員的一種機制。

class類和class類實例

person類代表人,他的實力對象就是張三、李四這樣這樣具體的人
class類代表Java類,他的實例對象:
對應各個類在內存中的字節碼,如:Person類的字節碼
一個類在虛擬機中只要一份字節碼

CLASS類:用於描述一切類/接口===枚舉是一種類,註解是一種接口
class實例:就指JVM中一份字節碼

問題:

    那class實例到底表示的是那一份字節碼,爲了明確區分出Class實例表示的是誰的字節碼,Class類提供了泛型Class<T(當前所表示的字節碼類型)>
Class<Date> clz1 = Date.class;//clz1表示的是Date的字節碼
class<String> clz2 = Date.class;//clz2表示的是String的字節碼

獲得class的實例:

1、類名.class(就是一份字節碼)

class<User> clz1 = User.class;//一份字節碼

2、Class.forName(String className);//根據一個類的全限定名來構建Class對象

Class<?> CLZ2 = Class.forName("cn.com.User");

3、每一個對象都有getClass()方法:obj.getClass();返回對象的真實類型(運行類型)

對象.getClass();得到對象的真實類型
Object obj = new Date();
Class clz3 = obj.getClass();

同一份字節碼,在java虛擬機中有且僅有一份

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章