java動態代理--一個簡單的例子


這幾天看視頻看到了java的動態代理,這里寫一個小例子。在寫例子的時候發現:認為自己會了,和能寫出來真不是一個概念。還是要多寫代碼,然后寫博客再深入一些,費曼學習法--教,是最好的學。

1.什么是動態代理

代理模式 
代理模式是常用的java設計模式,他的特征是代理類與委托類有同樣的接口,代理類主要負責為委托類預處理消息、過濾消息、把消息轉發給委托類,以及事后處理消息等。代理類與委托類之間通常會存在關聯關系,一個代理類的對象與一個委托類的對象關聯,代理類的對象本身並不真正實現服務,而是通過調用委托類的對象的相關方法,來提供特定的服務。 
按照代理的創建時期,代理類可以分為兩種。 
靜態代理:由程序員創建或特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。 
動態代理:在程序運行時,運用反射機制動態創建而成。

2.動態代理的Demo

首先創建一個接口,PersonDao

public interface PersonDao {
	public void say();
}

然后寫一個實現類PersonDaoImpl

public class PersonDaoImpl implements PersonDao{

	@Override
	public void say() {
		System.out.println("time to eat");
	}

}

然后寫個使用類PersonHandler

public class PersonHandler implements InvocationHandler {

	private Object obj;
	
	public PersonHandler(Object obj){
		this.obj=obj;
	}
	
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		
		System.out.println("before");
		Object result = method.invoke(obj, args);
		System.out.println("after");
		return result;
	}

}


PersonHandler必須要實現InvocationHandler接口

然后 再寫個測試類

public class PersonTest {
	
	@Test
	public void test(){
		PersonDao pDao = new PersonDaoImpl();
		PersonHandler handler = new PersonHandler(pDao);
		
		PersonDao proxy = (PersonDao)Proxy.newProxyInstance(pDao.getClass().getClassLoader(), pDao.getClass().getInterfaces(), handler);
		proxy.say();
	}
}
最后控制台輸出


至於具體細節,可能要研究一下源碼了,有時間再說吧





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM