什么是 Hook
Hook 又叫“鉤子”,它可以在事件傳送的過(guò)程中截獲并監(jiān)控事件的傳輸,將自身的代碼與系統(tǒng)方法進(jìn)行融入。這樣當(dāng)這些方法被調(diào)用時(shí),也就可以執(zhí)行我們自己的代碼,這也是面向切面編程的思想(AOP)。他主要涉及java反射和動(dòng)態(tài)代理兩方面的知識(shí)。
反射
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱(chēng)為java語(yǔ)言的反射機(jī)制。
要想解剖一個(gè)類(lèi),必須先要獲取到該類(lèi)的字節(jié)碼文件對(duì)象。而解剖使用的就是Class類(lèi)中的方法.所以先要獲取到每一個(gè)字節(jié)碼文件對(duì)應(yīng)的Class類(lèi)型的對(duì)象.
java 的動(dòng)態(tài)代理
代理模式是常用的java設(shè)計(jì)模式,他的特征是代理類(lèi)與委托類(lèi)有同樣的接口,代理類(lèi)主要負(fù)責(zé)為委托類(lèi)預(yù)處理消息、過(guò)濾消息、把消息轉(zhuǎn)發(fā)給委托類(lèi),以及事后處理消息等。代理類(lèi)與委托類(lèi)之間通常會(huì)存在關(guān)聯(lián)關(guān)系,一個(gè)代理類(lèi)的對(duì)象與一個(gè)委托類(lèi)的對(duì)象關(guān)聯(lián),代理類(lèi)的對(duì)象本身并不真正實(shí)現(xiàn)服務(wù),而是通過(guò)調(diào)用委托類(lèi)的對(duì)象的相關(guān)方法,來(lái)提供特定的服務(wù)。簡(jiǎn)單的說(shuō)就是,我們?cè)谠L問(wèn)實(shí)際對(duì)象時(shí),是通過(guò)代理對(duì)象來(lái)訪問(wèn)的,代理模式就是在訪問(wèn)實(shí)際對(duì)象時(shí)引入一定程度的間接性,因?yàn)檫@種間接性,可以附加多種用途。