摘要:為什么需要源語言與虛擬機存在語義上的差異中方法指的是方法參數和方法名稱完全一致這樣的操作稱為如果方法參數類型不一致包括參數類型或者參數的順序不一致這樣的操作稱為兩者在中的判斷都不包括返回值類型即返回值類型與兩者無關中對于同個方法名不同的與都
1.為什么需要bridgeMethod
Java(Java源語言)與 JVM 虛擬機 存在語義上的差異,Java中Override方法指的是方法參數和方法名稱完全一致.這樣的操作稱為Override.如果方法參數類型不一致(包括參數類型,或者參數的順序不一致),這樣的操作稱為Overloading.兩者在Java中的判斷都不包括返回值類型return type,即返回值類型與兩者無關
JVM中,對于同個方法名,不同的parameter type與return type 都可以看作Override操作,因為在JVM采用Full-Signature(全方法簽名)來校驗一個方法的合法性,全體包括method name,parameter type,return type
綜上,Java與JVM對Override的語義規則不一致.為了去除語義沖突,同時又不用修改JVM實現的需求下,bridgeMethod應運而生,可以把它看作我們web開發中常見的中間件(中間過程處理)來理解.
2.打破常規能生成Java字節碼的方式有很多 不止在編譯器中 如Idea,eclipse等 在編譯器中 相同方法名稱 不同的返回值編譯是不能通過的 但是我們可以通過其他方式來生成符合場景的字節碼文件
JVM與Java語義不一樣,舉個生活中的例子,這就好比方言和普通話,Java就是四川方言,JVM就是普通話,四川話:"你吃飯了沒得,幺兒",普通話:"你吃飯了嗎,兒子 or 女兒"(注意這里的差別).四川方言中,"幺兒"可以是兒子和女兒的統稱,這就對應Java中相同method name不區分return type.但是在普通話中,需要指明"兒子"或者是"女兒". 大家都是一個意思,只不過表達方式不一樣.普通話是中國話的標準,規則就更嚴格和細致.為了將方言翻譯成普通話能理解的意思,就要去除兩者的語義差異,這就是bridgeMethod的意義.
3.API相關根據reflect的相關方法,我們可以獲取一個Object Class的全部定義,包括屬性,方法名等等.
根據常規class.getDeclaredMethod(String name,Class>...paramterTypes) 可以根據方法名稱和參數類型獲取class中的方法,但是這個方法對相同方法名不同返回值無效.
可以通過class.getDeclaredMethod()獲取全部的方法
MethodHandles.Lookup提供了更豐富更靈活的API,可以根據method name,paramter type,return type的限定條件獲取一個方法
4.代碼實現一個接口SuperClass
public interface SuperClass{ T chifan(); }
一個實現類SubClass
public class SubClassimplements SuperClass{ @Override public String chifan(){ return "幺兒"; } }
在JVM中實現類SubClass的代碼如下
public class SubClassimplements SuperClass{ @Override public String chifan(){ return "幺兒";//這里是Java方言 幺兒的統稱 String類型 是"男孩","女孩" 都行 } @Override public Object chifan(){ return (String)"幺兒";//bridgeMethod 將"幺兒"指定為String類型,"男孩",或者是"女孩" } }
在Java中,子類SubClass實現了父類SuperClass的chifan()方法,相同的方法名,相同的方法參數列表,相同的方法參數類型,即在Java中,這已經完成了Override重寫的語義定義.但是在JVM中,這并不是能夠認可的Override行為.有語義沖突.所以創造了一個bridgeMethod方法
本人目前學習到的所有博客,對Java版本有特別印象(學習其他大佬的文章中經常提到的版本)的有3個.從低到高分別是Java5,Java7,Java8,本文中涉及到的技術點主要是Java5即Java 1.5以后出現的.所以我們來談下Java5的版本特性
5.追根溯源 Java5特性
Java5 support covaraint return type 支持可變返回類型,在Java5之前.子類實現的方法名稱,方法參數,返回類型都要相同,才叫method Override.具體可以看下篇文章
https://blogs.oracle.com/sund...
Java5以后,只要子類實現方法的返回類型是父類方法返回類型的子類,也可以認作是Override .
Java5以后支持范型,范型的出現是為了減少類型轉換異常.將一些運行時才能暴露的問題提前在編譯時暴露.可以參見下面的代碼
List list=new ArrayList(); list.add("wcl"); list.add(2.50);
上面的代碼沒有問題,但是并不好,因為指代不明.在Idea中會出現類型未檢查的異常.接著來舉例.
有一個女老師,帶小學生們出去春游.
老師說:"孩子們,老師帶你們上廁所,走吧走吧".(規則指定 女老師只能帶小女孩去上廁所).可是因為"孩子們"這樣的稱呼,指代不明,我這樣呆萌的小男孩也會跟著老師去上廁所,那這就尷尬了,就會有誤入女廁的情況發生.
為了避免這種情況發生.范型出現了.如下
Listlist=new ArrayList(); list.add("wcl"); list.add(2.50);// error
范型的作用如上所示 就像是女老師的話變為
老師說:"女孩子們,老師帶你們上廁所,走吧走吧".這時呆萌的小男孩就不會跟著老師去了.去了就要被教育
本文的bridgeMethod也可以用上面的例子舉例.
"孩子們,老師帶你們上廁所" 這是Java中的語義
"孩子們,老師帶你們上男廁所"這是JVM中的語義
看起來 范型的使用就是規則限定前置 bridgeMethod的使用 就是規則限定后置 兩者有異曲同工之妙
6.結語最近學習大佬的 SpringMVC:源代碼分析與實現 里面的 BridgeMethodResolver 然后學習了bridgeMethod 以上都是本人看博客的一些總結 然后用自認為容易理解的形式 和 本人學習過程中模糊點的解釋 .特別是第2點,我總以為Java與JVM之間語義是一致的,或許更準確的說,我一直都不知道Java與JVM存在語義差異.所以看一些質量不高的博客后總有一種似懂非懂的感覺.學技術應該知其然更知其所以然.如果有問題,請大佬們指正.幫助我進步.謝謝.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74895.html
In my opinion ABAP ICF handler and Java Servlet play the same role in enhancement which enables your web server with additional functionality. This blog will not introduce how an ICF handler class in ...
摘要:實現的功能有登錄注冊保存有一個成員變量所有的注冊用戶使用一個來管理,登錄注冊都是對的操作保存是將序列化到本地的文件,通過讀取文件來反序列化,實現數據的持久化實現的功能有添加查詢刪除清除保存。 本文HelloCorba參考 Getting Started with JavaTM IDL 說在前面 Java TM IDL is a technology for distributed ob...
摘要:流讀寫基本功能新建文件查看列表寫文件刪除文件查看文件導入的包下面新建一個類,然后在函數里初始化一個方法,方法中用來判斷輸入的值所相對應的功能板塊。這里也只限制于在正常情況下的輸入輸出。 IO流讀寫 基本功能: 新建文件 查看列表 寫文件 刪除文件 查看文件 導入的包: import java.io.BufferedInputStream; import java.io.Buffe...
包 本課程解釋了如何將類和接口捆綁到包中,如何使用包中的類,以及如何安排文件系統以便編譯器可以找到源文件。 創建和使用包 為了使類型更易于查找和使用,避免命名沖突和控制訪問,程序員將相關類型的組捆綁到包中。 定義:包是一組提供訪問保護和名稱空間管理的相關類型,請注意,類型引用類、接口、枚舉和注解類型,枚舉和注解類型分別是特殊的類和接口,因此在本課中通常將類型簡稱為類和接口。 作為Java平臺一部...
摘要:從所有的進程中找出最消耗的線程缺省個,打印出其線程棧用法要顯示的線程棧數要顯示的線程棧數指定的腳本找出庫,即文件或目錄類目錄中的重復類。通過腳本參數指定目錄,查找目錄下文件,收集文件中文件以分析重復類。 show-busy-java-threads.sh 從所有的 Java 進程中找出最消耗 CPU 的線程(缺省5個),打印出其線程棧 用法 ./show-busy-java-threa...
閱讀 3967·2021-11-24 09:38
閱讀 1234·2021-10-19 11:42
閱讀 1833·2021-10-14 09:42
閱讀 2159·2019-08-30 15:44
閱讀 547·2019-08-30 14:04
閱讀 2897·2019-08-30 13:13
閱讀 1956·2019-08-30 12:51
閱讀 963·2019-08-30 11:22