亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

bridgeMethod In Java

alaege / 1193人閱讀

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

1.為什么需要bridgeMethod

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

JVM中,對(duì)于同個(gè)方法名,不同的parameter typereturn type 都可以看作Override操作,因?yàn)樵贘VM采用Full-Signature(全方法簽名)來(lái)校驗(yàn)一個(gè)方法的合法性,全體包括method name,parameter type,return type

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

2.打破常規(guī)

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

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

3.API相關(guān)

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

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

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

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

4.代碼實(shí)現(xiàn)

一個(gè)接口SuperClass

public interface SuperClass{
    T chifan();
}

一個(gè)實(shí)現(xiàn)類SubClass

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

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

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

5.追根溯源 Java5特性

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

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

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

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

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

上面的代碼沒(méi)有問(wèn)題,但是并不好,因?yàn)橹复幻?在Idea中會(huì)出現(xiàn)類型未檢查的異常.接著來(lái)舉例.

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

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

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

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

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

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

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

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

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

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

6.結(jié)語(yǔ)

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.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 評(píng)論0 收藏0
  • Java/CORBA

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

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

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

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

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

    617035918 評(píng)論0 收藏0
  • 線上問(wèn)題排查常見(jiàn)腳本工具

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

    vvpvvp 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<