­

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方法,並在方法裡面通過方法名判斷,需要增強的方法。