getClass() 方法、Class 對象和反射介紹 - 1

“嗨,阿米戈!”

“現在是重頭戲了。我們將熟悉 Class 類並接觸反射。
正如您可能已經意識到的那樣,Java 中的一切都是對象。對象需要什麼?每個對象定義了什麼這是怎麼回事?”

“一類!”

“對!幹得好。每個對像都有一個類。但是回到對象......有些對象完全包含一個實體,而其他對像只是幫助管理它。”

“後一種類型包括FileOutputStreamThread。當您創建Thread對象時,不會創建新線程。線程是在調用 start() 方法後由 Java 虛擬機創建的。該對像只是幫助管理進程。”

“與FileOutputStream相同:文件存儲在磁盤上,操作系統管理存儲和訪問。但我們可以通過 File 對象與它交互,再次借助 Java 虛擬機。”

“是的,我已經明白了。”

“所以,有一個特殊的類,叫做Class,用於與類進行交互。”

“這不難猜。”

“是的。每次 Java 虛擬機將一個新類加載到內存中時,它都會創建一個 Class 對象,您可以使用它來獲取有關加載類的特定信息。”

“每個類和對像都與一個 «類對象»相關聯。”

例子 描述
Class clazz = Integer.class;
獲取 Integer 類的 Class 對象。
Class clazz = int.class;
獲取 int 類的 Class 對象。
Class clazz = "123".getClass();
獲取 String 對象的 Class 對象。
Class clazz = new Object().getClass();
獲取 Object 對象的 Class 對象。

“哇!真有趣!”

“你還記得類這個詞Java中是關鍵字,不能用作變量名嗎?”

“哦,是的,我知道,我知道。我只是忘記了。”

“您是否已經在某處使用了 Class 對象?”

“是的,我們在編寫自己的 equals 方法實現時使用了它。”

“是的,您可以使用 getClass() 方法來測試對像是否具有相同的類。”

“你能用這個東西做什麼?”

“好吧,很多事情:”

Java代碼 描述
Class s = int.class;
String name = s.getName();
獲取類名。
Class s = Class.forName("java.lang.String");
按名稱獲取類。
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
比較對象的類。

“有趣,但沒有我想像的那麼酷。”

“要酷嗎?還有倒影, 倒影超酷。”

“什麼是反射?”

"反射是一個類獲取自身信息的能力。Java 有特殊的類:  FieldMethod,它們類似於類的Class類。就像Class對象讓你獲得一個類的信息一樣,Field 對象提供一個字段的信息,並且 Method 對象提供有關方法的信息。看看你可以用它們做什麼:“

Java代碼 描述
Class[] interfaces = List.class.getInterfaces();
獲取 List 類接口的 Class 對象列表
Class parent = String.class.getSuperclass();
獲取String類的父類的Class對象
Method[] methods = List.class.getMethods();
獲取 List 類的方法列表
String s = String.class.newInstance();
創建一個新的字符串
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s)
獲取 String 類的 length 方法並在 String 上調用它

“哇!那真是太酷了!”