刘欣《码农翻身》之动态代理读后感
很生動地通過故事講明白了Java動態代理這么個事,很棒:
為什么需要動態代理:人們希望在運行時動態修改類,但是,Java一個類一旦被裝入方法區,就沒法動態修改已經編譯好的類了
解決方案:已經被加載或者正在運行的類既然不能被修改,就需要運行時動態生成一個代理類,達到“運行時動態修改類”的目的。
代理類是基于原來的類生成的新的類,具有運行時需要的功能,比如日志記錄、事務支持、權限控制等。
如何實現功能的動態添加:
在看head first in Java時,有講過接口的使用原則,符合has-a關系時使用接口,像是一個,當需要使用行為時使用接口,比如我想使用鋼琴的發聲功能,那我只需要實現鋼琴的接口,接口里面有發聲的功能,我是個人,我可以借助鋼琴的接口發出鋼琴的聲音,但我不是鋼琴,我是人。OK
所以在運行時需要動態添加的行為都可以認為是has-a關系,這樣,新的類通過代理接口,就可以具有想要的功能了,下面詳細說說代理接口:
public interface IHelloWorld{public void sayHello(); } public class HelloWorld implements IHelloWorld{public void sayHello(){System.out.println("hello world!");} }現在是要在方法層面,給代理接口里的方法里添加功能,如何做這么細粒度的動態功能增強呢?(也可以說是織入,這個詞,在國內是瘋狂軟件的李剛老師第一個提出來的,老師就真的很強,向走在前面的探路人,偉大的前輩們致敬!)
如何給代理接口中的這個目標方法,添加想要的功能呢?必須通過實現InvocationHandler接口,那么我們來看看這個接口里面有什么:
只有一個方法invoke!通過這個接口里的方法,寫你需要動態增強的功能,比如日志記錄等等。invoke中文:調用、引用,也就是說這個接口的功能,就是讓你在運行期間動態增強時調用這個方法來代替原來的方法,達到在原方法基礎上功能增強的目的。
public class LoggerHandler implements InvocationHandler {private Object target;public LoggerHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 要增強的功能Logger.startLog();// 原來的方法Object result = method.invoke(target, args);// 要增強的功能Logger.endLog();return result;}}說說LoggerHandler,英文:處理日志記錄的人,那么他就負責記錄日志,代理類會調用它,并把真正的目標方法傳給他(method變量)讓他為目標方法添加日志記錄的功能!
用Proxy.newProxyInstance(...)生成動態代理的類,這個類的代理方法(目標方法),包含了增強的功能!
IHelloWorld hw = new HelloWorld(); LoggerHandler handler = new LoggerHandler(hw); IHelloWorld proxy = (IHelloWorld) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),hw.getClass().getInterface(),handler); proxy.sayHello();所以運行時其實是動態生成了代理類,并調用了LoggerHandler的invoke方法實現功能增強。
所以用面向對象的方式思考動態代理?,總結下來就是:
我們要為一個對象的行為添加一個動作,比如啪啪啪前帶套套的動作,此時我們需要把啪啪啪這個動作抽象出來,創建一個另我(代理對象),讓全新的我實現這個啪啪啪的接口來執行啪啪啪動作,然后創建一個另一半,她擁有帶套套的功能,它通過實現InvocationHandler接口,擁有invoke的功能,在這個功能里,可以設計她如何為我帶套套,同時又可以擁有和我啪啪啪的行為(我把啪啪啪的method變量傳遞給她)。之后我在啪啪啪的時候(運行時),通過啪啪啪行為(面向接口編程)創建出來的全新的我,會把會帶套套和我啪啪的另一半也融合進來,再調用啪啪啪行為時,就會有另一半為我帶套套。實現了啪啪啪時才帶套(運行時動態增加行為),而不是妹子還沒約到就開始自己帶套!
總結
以上是生活随笔為你收集整理的刘欣《码农翻身》之动态代理读后感的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1039 数的划分
- 下一篇: vue项目中实现输入框防抖功能