⑴ 怎麼理解java中的反射,作用是什麼
反射是審查元數據並收集關於它的類型信息的能力。元數據(編譯以後的最基本數據單元)就是一大堆的表,當編譯程序集或者模塊時,編譯器會創建一個類定義表,一個欄位定義表,和一個方法定義表等.
反射的主要作用是用來擴展系統和動態調用程序集。
所謂擴展系統就是先把系統寫好,系統裡面定義介面,後面開發的人去寫介面的代碼。
此時該系統就要用反射了,系統用反射調用介面,當介面沒寫,系統利用反射就不會不會出錯,此時就等於沒實現此功能而已,當介面被人寫好了,系統就會自動調用介面的功能展現在系統上。
即反射實現即插即用功能。
動態調用程序集就是利用反射去調用編譯好的dll,當然此時的dll沒有被引用到你所建的工程裡面。
當你編譯你的工程時,不會編譯你調用的dll,當你運行到調用dll時,此時才會去調用dll,判斷是否有語法語義,等編譯,運行的錯誤。
這樣利用反射具有一定靈活性,就是不用從你的工程調用dll,還有就是dll可隨時改變(當然介面還是要對應),不需改變你所建的工程。
總之反射最好的好處就是新建工程時後不須一定要寫好dll,可新建完工程後,後期寫dll也可以。即所謂後期綁定。當然利用反射是耗資源的,損失效率,如果不是在上面的場合利用此技術,可能不會帶來好處,反而是壞處。
⑵ java反射的性能為什麼低
java反射需要將內存中的對象進行解析,涉及到與底層c語言的交互,速度會比較慢。
java反射得到的每一個Method都有一個root,不暴漏給外部,而是每次一個Method。具體的反射調用邏輯是委託給MethodAccessor的,而accessor對象會在第一次invoke的時候才創建,是一種lazy init方式。而且默認Class類會cache method對象。目前MethodAccessor的實現有兩種,通過設置inflation,一個native方式,一種生成java bytecode方式。native方式啟動快,但運行時間長了不如java方式,個人感覺應該是java方式運行長了,jit compiler可以進行優化。所以JDK6的實現,在native方式中,有一個計數器,當調用次數達到閥值,就會轉為使用java方式。默認值是15。java方式的實現,基本和非反射方式相同。
⑶ java反射究竟消耗多少效率
首先明確概念
String str = new String();
上面的String稱為『類』,str指向的目標稱為『實體』。到此無法理解的話,請溫習java面向對象的基礎後再往下閱讀。
反射實現的核心是Class類。運行時,每一個類都對應一個Class實體,利用這些實體完成反射行為。這些實體是在jvm進行類載入時完成創建的,不論是否有反射操作,所以和反射的開銷無關。
反射機制是對人來說的一種邏輯特徵,對計算機來說,和普通的方法調用沒有任何區別,所以在編譯階段的開銷差距不大,可能會更小(因為引包更少)。
java是強類型語言,反射能夠在使用上弱化這種『強』。正常的實體創建和方法調用,是通過地址直接調用的,而反射是通過字元串的匹配來定址,再按地址調用,中間多出一步定址。定址的開銷在執行實體內部方法以及靜態方法時和Map類的鍵值對定址開銷相同,基本可以忽略。構造方法稍微復雜一點,但差距也不大。
綜上,就本人考慮到的內容,反射相比直接調用,只增加了簡單幾步定址過程,不會對效率造成太大影響。
⑷ java面試題:如何提高反射效率
1、在系統啟動階段使用反射。
2、將反射得到元數據保存起來,使用時,只需從內存中調用即可。
3、hotspot虛擬機會對執行次數較多的方法進行優化(例如使用jit技術)。
4、使用高性能的反射庫,應該會比自己寫緩存效果好。
⑸ java 中 clazz.newInstance 和 supplier.get() 哪個效率更高
1、newInstance是弱類型、低效率的代表。
2、supplier是1.8提供的函數式介面,惰性執行(即用之前才會真的new),只是延遲了new的時間而已,但仍然是直接new(而不是反射)
3、所以supplier的效率高