Java基礎教程之Java反射

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

反射是Java中核心技術之一,這里先不定義什麼叫反射,先看一個例子

Java基礎教程之Java反射-雪花新聞

要求:

1) 創建一個person的實例,單不能使用Person person = new Person()的方式

2) 調用run()方法,也不能使用person.run()方式

我們知道要調用方法必須先要有對象,現在不能通過new關鍵字來實例化對象,只能通過反射來做到。

Java基礎教程之Java反射-雪花新聞

上面就做到用反射的方式調用preson類中的方法。可能有人要問了,為什麼不直接new 出來呢? 通過反射來創建對象,調用方法多費勁啊?

關鍵在於很多時候我們並不能事先知道要new 什麼對象,相反我們可能只知道一個類的名稱和方法名, 很多時候這些名稱都是寫在XML配置當中的。

好多框架中用到了反射,比如sturts,spring,hibernate等,下面舉幾個列子說明

【Strust2】

在struts.xml中配置的action

Java基礎教程之Java反射-雪花新聞

定義的action

Java基礎教程之Java反射-雪花新聞

Struts2框架本身不知道我們有一個TopicAction這個類,但它可以這樣做,在struts2框架初始化的時候解析你配置的xml,再找到你配置TopicAction,然後通過反射的技術實例化這個類,等在有人調用的時候通過反射調用topicAction中的方法。

【Hibernate】

Java基礎教程之Java反射-雪花新聞

文件的定義

Java基礎教程之Java反射-雪花新聞

在映射文件中建立了數據表和對象的映射關係,所以我們在hibernate中操作的都是對象,但是底層都會轉成sql執行,比如我們要查詢一個對象,

Topic topic = session.get(Topic.class,12);

執行過程是這樣的:

【類名】==>【表明】==>【發出sql語句】==>【通過反射實例化對象】==>【通過反射調用setXxx()方法把數據庫的值設進入】

總結一下,反射就是在編譯期不知道創建那個類,而是在運行期才知道創建那個類,這種情況下就應該考慮到用反射。

那反射能做什麼呢?

1) 獲取一個類的內部結構,比如:方法,屬性,註解等

2) 運行時對一個Java對象操作,包括實例化對象,調用方法,給屬性賦值。

為什麼叫反射呢?

可能是Java程序在運行時能夠看到自己的結構和行為吧,就像看到鏡子當中的自己一樣, 反射了出來。