Reflection.newProxy

傳統方法要針對某一個類別中的方法做特殊處理(前處理或後處理),通常我們會將其覆寫或透過Proxy Pattern方式;現今甚至可以透過AOP方式,去達到我們的目的。Guava提供簡便的Dynamic Proxy,讓我們可以針對某“介面”所宣告的method做處理。

我透過以下類別為範例做解說:

interface TestClassInterface {
	int test1();
	int test2();
}
public class TestClass implements TestClassInterface {
	public int test1(){
		System.out.println("test1");
		return 1;
	}
 
	public int test2(){
		System.out.println("test2");
		return 2;
	}
}

我想針對TestClass的test2方法做後製,將它的結果+1,以下為我的程式碼:

@Test
public void testNewProxy(){
	TestClass tc = new TestClass();
	TestClassInterface tci= Reflection.newProxy(TestClassInterface.class,
		(Object proxy, Method method, Object[] args)->{
 
		if( method.getName().equals("test2") ) {
			return (int)method.invoke(tc, args)+1;
		}
		System.out.println("proxy");
		return method.invoke(tc, args);
	});
 
	System.out.println("execute: ");
	Assert.assertEquals(1, tci.test1());
	Assert.assertEquals(3, tci.test2());
}

從程式碼得知,要做後製的方法可以透過method.getName去處理;不需要的部分則按照原方法呼叫就可以了。

Output:

execute: 
proxy
test1
test2