這是本文件的舊版!


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;
	}
}

@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());
}