理解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方法增強的三種方式。