Java增強原有方法的三種方式
- 2020 年 1 月 19 日
- 筆記
1、第一種,也是最簡單的一種,繼承類,覆蓋原有方法
Cat cat = new Cat(){ @Override public void run(){ //調用父類的run方法 super.run(); System.out.println("我是方法增強部分"); } }
這個比較容易理解,而且我們也用的挺多的。但是用這個方法有一個前提,就是我們能控制類的創建。這種時候,才能這麼做。比如工場模式就不能這樣。
2、裝飾者模式
這個比第一個複雜很多,這裡我慢慢解釋。
首先,假如我們還是要增強Cat的run方法。假設Cat實現一個ICat介面。這個時候我們需要一個裝飾者來幫我們擴展方法。而且這個裝飾者必須實現ICat介面。(實際運用中,裝飾者必須與源對象實現相同介面或者繼承相同父類)下面就是裝飾者類的寫法
class CatFilter implements ICat{ //聲明cat對象 private ICat cat; public CatFilter(ICat cat){ this.cat = cat; } public void run(){ cat.run(); System.out.println("這是方法增強部分"); } }
在我們擴展方法時,就應該調用裝飾者的run方法
ICat cat = new Cat();CatFilter catFilter = new CatFilter(cat);catFilter.run();
3、動態代理
這裡就不細糾動態代理是啥了,一般寫法都不會變
//創建Cat對象ICat cat = new Cat();ICat catProxy = Proxy.newProxyInstance(cat.getClass().getClassLoader, cat.getClass().getInterfaces(), new InvocationHandler(){ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{ if(method.getName().eques("run")){ method.invoke(cat, args); System.out.println("這是方法增強部分"); } return null; } });catProxy.run();
這裡就是調用Proxy.newProxyInstance()方法,傳入三個參數。
第一個就是ClassLorder,第二個是對象的所有介面,第三個就是InvocationHandler。重寫InvocationHandler中的invoke方法,並在方法裡面通過方法名判斷,需要增強的方法。