成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

bridgeMethod In Java

alaege / 1118人閱讀

摘要:為什么需要源語言與虛擬機存在語義上的差異中方法指的是方法參數(shù)和方法名稱完全一致這樣的操作稱為如果方法參數(shù)類型不一致包括參數(shù)類型或者參數(shù)的順序不一致這樣的操作稱為兩者在中的判斷都不包括返回值類型即返回值類型與兩者無關(guān)中對于同個方法名不同的與都

1.為什么需要bridgeMethod

Java(Java源語言)與 JVM 虛擬機 存在語義上的差異,JavaOverride方法指的是方法參數(shù)和方法名稱完全一致.這樣的操作稱為Override.如果方法參數(shù)類型不一致(包括參數(shù)類型,或者參數(shù)的順序不一致),這樣的操作稱為Overloading.兩者在Java中的判斷都不包括返回值類型return type,即返回值類型與兩者無關(guān)

JVM中,對于同個方法名,不同的parameter typereturn type 都可以看作Override操作,因為在JVM采用Full-Signature(全方法簽名)來校驗一個方法的合法性,全體包括method name,parameter type,return type

綜上,JavaJVMOverride的語義規(guī)則不一致.為了去除語義沖突,同時又不用修改JVM實現(xiàn)的需求下,bridgeMethod應(yīng)運而生,可以把它看作我們web開發(fā)中常見的中間件(中間過程處理)來理解.

2.打破常規(guī)

能生成Java字節(jié)碼的方式有很多 不止在編譯器中 如Idea,eclipse等 在編譯器中 相同方法名稱 不同的返回值編譯是不能通過的 但是我們可以通過其他方式來生成符合場景的字節(jié)碼文件

JVMJava語義不一樣,舉個生活中的例子,這就好比方言和普通話,Java就是四川方言,JVM就是普通話,四川話:"你吃飯了沒得,幺兒",普通話:"你吃飯了嗎,兒子 or 女兒"(注意這里的差別).四川方言中,"幺兒"可以是兒子和女兒的統(tǒng)稱,這就對應(yīng)Java中相同method name不區(qū)分return type.但是在普通話中,需要指明"兒子"或者是"女兒". 大家都是一個意思,只不過表達方式不一樣.普通話是中國話的標準,規(guī)則就更嚴格和細致.為了將方言翻譯成普通話能理解的意思,就要去除兩者的語義差異,這就是bridgeMethod的意義.

3.API相關(guān)

根據(jù)reflect的相關(guān)方法,我們可以獲取一個Object Class的全部定義,包括屬性,方法名等等.

根據(jù)常規(guī)class.getDeclaredMethod(String name,Class...paramterTypes) 可以根據(jù)方法名稱和參數(shù)類型獲取class中的方法,但是這個方法對相同方法名不同返回值無效.

可以通過class.getDeclaredMethod()獲取全部的方法

MethodHandles.Lookup提供了更豐富更靈活的API,可以根據(jù)method name,paramter type,return type的限定條件獲取一個方法

4.代碼實現(xiàn)

一個接口SuperClass

public interface SuperClass{
    T chifan();
}

一個實現(xiàn)類SubClass

public class SubClass implements SuperClass{
  @Override
  public String chifan(){
    return "幺兒";
  }
} 

JVM中實現(xiàn)類SubClass的代碼如下

public class SubClass implements SuperClass{
  @Override
  public String chifan(){
    return "幺兒";//這里是Java方言 幺兒的統(tǒng)稱 String類型 是"男孩","女孩" 都行
  }
  
  @Override
  public Object chifan(){
    return (String)"幺兒";//bridgeMethod 將"幺兒"指定為String類型,"男孩",或者是"女孩"
  }
} 

Java中,子類SubClass實現(xiàn)了父類SuperClasschifan()方法,相同的方法名,相同的方法參數(shù)列表,相同的方法參數(shù)類型,即在Java中,這已經(jīng)完成了Override重寫的語義定義.但是在JVM中,這并不是能夠認可的Override行為.有語義沖突.所以創(chuàng)造了一個bridgeMethod方法

本人目前學(xué)習(xí)到的所有博客,對Java版本有特別印象(學(xué)習(xí)其他大佬的文章中經(jīng)常提到的版本)的有3個.從低到高分別是Java5,Java7,Java8,本文中涉及到的技術(shù)點主要是Java5Java 1.5以后出現(xiàn)的.所以我們來談下Java5的版本特性

5.追根溯源 Java5特性

Java5 support covaraint return type 支持可變返回類型,在Java5之前.子類實現(xiàn)的方法名稱,方法參數(shù),返回類型都要相同,才叫method Override.具體可以看下篇文章

https://blogs.oracle.com/sund...

Java5以后,只要子類實現(xiàn)方法的返回類型是父類方法返回類型的子類,也可以認作是Override .

Java5以后支持范型,范型的出現(xiàn)是為了減少類型轉(zhuǎn)換異常.將一些運行時才能暴露的問題提前在編譯時暴露.可以參見下面的代碼

List list=new ArrayList();
list.add("wcl");
list.add(2.50);

上面的代碼沒有問題,但是并不好,因為指代不明.在Idea中會出現(xiàn)類型未檢查的異常.接著來舉例.

有一個女老師,帶小學(xué)生們出去春游.

老師說:"孩子們,老師帶你們上廁所,走吧走吧".(規(guī)則指定 女老師只能帶小女孩去上廁所).可是因為"孩子們"這樣的稱呼,指代不明,我這樣呆萌的小男孩也會跟著老師去上廁所,那這就尷尬了,就會有誤入女廁的情況發(fā)生.

為了避免這種情況發(fā)生.范型出現(xiàn)了.如下

List list=new ArrayList();
list.add("wcl");
list.add(2.50);// error

范型的作用如上所示 就像是女老師的話變?yōu)?/p>

老師說:"女孩子們,老師帶你們上廁所,走吧走吧".這時呆萌的小男孩就不會跟著老師去了.去了就要被教育

本文的bridgeMethod也可以用上面的例子舉例.

"孩子們,老師帶你們上廁所" 這是Java中的語義

"孩子們,老師帶你們上男廁所"這是JVM中的語義

看起來 范型的使用就是規(guī)則限定前置 bridgeMethod的使用 就是規(guī)則限定后置 兩者有異曲同工之妙

6.結(jié)語

最近學(xué)習(xí)大佬的 SpringMVC:源代碼分析與實現(xiàn) 里面的 BridgeMethodResolver 然后學(xué)習(xí)了bridgeMethod 以上都是本人看博客的一些總結(jié) 然后用自認為容易理解的形式 和 本人學(xué)習(xí)過程中模糊點的解釋 .特別是第2點,我總以為JavaJVM之間語義是一致的,或許更準確的說,我一直都不知道JavaJVM存在語義差異.所以看一些質(zhì)量不高的博客后總有一種似懂非懂的感覺.學(xué)技術(shù)應(yīng)該知其然更知其所以然.如果有問題,請大佬們指正.幫助我進步.謝謝.

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74895.html

相關(guān)文章

  • ABAP SICF服務(wù)和Java Servlet的比較

    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 ...

    Youngs 評論0 收藏0
  • Java/CORBA

    摘要:實現(xiàn)的功能有登錄注冊保存有一個成員變量所有的注冊用戶使用一個來管理,登錄注冊都是對的操作保存是將序列化到本地的文件,通過讀取文件來反序列化,實現(xiàn)數(shù)據(jù)的持久化實現(xiàn)的功能有添加查詢刪除清除保存。 本文HelloCorba參考 Getting Started with JavaTM IDL 說在前面 Java TM IDL is a technology for distributed ob...

    masturbator 評論0 收藏0
  • 基于java的IO流的文件讀取系統(tǒng)

    摘要:流讀寫基本功能新建文件查看列表寫文件刪除文件查看文件導(dǎo)入的包下面新建一個類,然后在函數(shù)里初始化一個方法,方法中用來判斷輸入的值所相對應(yīng)的功能板塊。這里也只限制于在正常情況下的輸入輸出。 IO流讀寫 基本功能: 新建文件 查看列表 寫文件 刪除文件 查看文件 導(dǎo)入的包: import java.io.BufferedInputStream; import java.io.Buffe...

    chunquedong 評論0 收藏0
  • Java? 教程(創(chuàng)建和使用包)

    包 本課程解釋了如何將類和接口捆綁到包中,如何使用包中的類,以及如何安排文件系統(tǒng)以便編譯器可以找到源文件。 創(chuàng)建和使用包 為了使類型更易于查找和使用,避免命名沖突和控制訪問,程序員將相關(guān)類型的組捆綁到包中。 定義:包是一組提供訪問保護和名稱空間管理的相關(guān)類型,請注意,類型引用類、接口、枚舉和注解類型,枚舉和注解類型分別是特殊的類和接口,因此在本課中通常將類型簡稱為類和接口。 作為Java平臺一部...

    617035918 評論0 收藏0
  • 線上問題排查常見腳本工具

    摘要:從所有的進程中找出最消耗的線程缺省個,打印出其線程棧用法要顯示的線程棧數(shù)要顯示的線程棧數(shù)指定的腳本找出庫,即文件或目錄類目錄中的重復(fù)類。通過腳本參數(shù)指定目錄,查找目錄下文件,收集文件中文件以分析重復(fù)類。 show-busy-java-threads.sh 從所有的 Java 進程中找出最消耗 CPU 的線程(缺省5個),打印出其線程棧 用法 ./show-busy-java-threa...

    vvpvvp 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<