天天看點

Java基礎三、反射

57、什麼是反射?

反射是在運作狀态中,對于任意一個類,都能知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動态擷取的資訊以及動态調用對象的方法的功能稱為Java語言的反射機制。

58、什麼是Java序列化?什麼情況下需要序列化?

Java序列化是為了儲存各種對象在記憶體中的狀态,并且可以把儲存的對象狀态再讀取出來。

以下情況需要使用Java序列化

1) 想把記憶體中的對象狀态儲存到一個檔案中或者資料庫中

2) 想用套接字在網絡上傳輸對象的時候

3) 想通過RMI(遠端方法調用)傳輸對象的時候。

59、動态代理是什麼? 有哪些應用?

動态代理是運作時動态生成代理類。

動态代理的應用: spirng aop, hiberanate資料查詢,測試架構的後端mock,rpc, Java注解對象擷取等。

60. 怎麼實作動态代理?

JDK原生動态代理和cglib動态代理。 JDK原生動态代理是基于接口實作的,而cglib是基于目前繼承目前類的子類實作的。

二、其它

1、反射的缺點

性能第一  Performance Overhead

Because reflection involves types that are dynamically resolved, certain Java virtual machine optimizations can not be performed. Consequently, reflective operations have slower performance than their non-reflective counterparts, and should be avoided in sections of code which are called frequently in performance-sensitive applications. 

反射包括了一些動态類型,是以JVM無法對這些代碼進行優化。是以,反射操作的效率要比那些非反射操作低得多。我們應該避免在經常被 執行的代碼或對性能要求很高的程式中使用反射。

安全限制  Security Restrictions

Reflection requires a runtime permission which may not be present when running under a security manager. This is in an important consideration for code which has to run in a restricted security context, such as in an Applet. 

使用反射技術要求程式必須在一個沒有安全限制的環境中運作。如果一個程式必須在有安全限制的環境中運作,如Applet,那麼這就是個問題了。

内部暴露  Exposure of Internals