国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

bridgeMethod In Java

alaege / 1115人閱讀

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

1.為什么需要bridgeMethod

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

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

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

2.打破常規

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

JVMJava語義不一樣,舉個生活中的例子,這就好比方言和普通話,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 SubClass implements SuperClass{
  @Override
  public String chifan(){
    return "幺兒";
  }
} 

JVM中實現類SubClass的代碼如下

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

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

本人目前學習到的所有博客,對Java版本有特別印象(學習其他大佬的文章中經常提到的版本)的有3個.從低到高分別是Java5,Java7,Java8,本文中涉及到的技術點主要是Java5Java 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中會出現類型未檢查的異常.接著來舉例.

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

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

為了避免這種情況發生.范型出現了.如下

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

范型的作用如上所示 就像是女老師的話變為

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

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

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

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

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

6.結語

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74895.html

相關文章

  • ABAP SICF服務和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

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

    masturbator 評論0 收藏0
  • 基于java的IO流的文件讀取系統

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

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

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

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

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

    vvpvvp 評論0 收藏0

發表評論

0條評論

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