理解Java方法增強
- 2020 年 1 月 19 日
- 筆記
在實際開發中,我們往往需要對某些方法進行增強,常用的方法增強的方式有三種。
- 類繼承 、方法覆蓋 必須控制對象創建,才能使用該方式
- 裝飾者模式方法加強 必須和目標對象實現相同接口或繼續相同父類,特殊構造器(傳入被包裝對象)
- 動態代理
我們來編寫一個案例感受一下,新建一個Java項目。 新建類Cat
public class Cat{ public void run(){ System.out.println("喵喵~一隻貓在奔跑"); } }
現在若想對該類的run()方法進行增強,第一種方法,利用類繼承,方法覆蓋。 編寫測試代碼
@Test public void demo1(){ //方法增強的第一種途徑,利用類的繼承以及方法覆蓋 Cat cat = new Cat(){//匿名內部類 @Override public void run() { //保持方法原有的功能 super.run(); //新增該方法功能 System.out.println("抓到一隻老鼠"); } }; cat.run(); }
運行測試代碼

方法成功被增強了。 該種增強方法的方式必須控制對象的創建。
那麼第二種增強方式就是裝飾者模式,但是請注意,使用該方式增強方法是有前提的,就是必須與原對象去實現相同的接口或者繼承相同的類。 演示一下。 新建一個接口ICat
interface ICat{ public void run(); }
然後新建一個裝飾者CatFilter
//裝飾者 class CatFilter implements ICat{ private ICat cat;//cat就是被包裝的對象 //實現目標對象相同的接口 //特殊的構造方法 public CatFilter(ICat cat){ this.cat = cat; } public void run() { //原有方法功能 cat.run(); //新增方法功能 System.out.println("又抓住一隻老鼠"); } }
編寫測試代碼
@Test public void demo2(){ //第二種 裝飾者模式 前提:必須與原對象去實現相同的接口或者繼承相同的類 ICat cat = new CatFilter(new Cat()); cat.run(); }

方法被成功增強。
第三種增強方式就是動態代理,也是Java中進行方法增強最常用的方式。 原理:根據原對象在內存中構造一個代理對象,而原對象的所有方法都將去執行代理對象的invoke方法。 演示一下。 編寫測試代碼
@Test public void demo3(){ final ICat cat = new Cat();//原對象 ICat catProxy = (ICat) Proxy.newProxyInstance(cat.getClass().getClassLoader(), cat.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] objs) throws Throwable { //增強run方法 if(method.getName().equals("run")){ method.invoke(cat,objs);//調用原對象的方法,保留原方法的功能 //新增功能 System.out.println("抓住第三隻老鼠"); } return null; } }); catProxy.run(); }
運行測試代碼

方法被成功增強。 以上便是Java方法增強的三種方式。