1. 程式人生 > >Java學習筆記 (八) 反編譯 switch 觀察其實現細節

Java學習筆記 (八) 反編譯 switch 觀察其實現細節

看了H大的部落格之後,發現還有反編譯程式碼看實現細節的操作,學習一波,吸收營養。文末放部落格連結地址。

switch對整型支援的實現細節

原始碼,如下:

public class SwitchTest{

    public static void main(String[] args) {

        int a=1;
        switch (a) {
        case 1:
            System.out.println(1);
            break;
        case 5:
            System.out.println(5
); break; case 6: System.out.println(6); default: break; } } }

反編譯之後:

import java.io.PrintStream;
public class SwitchTest {
    public static void main(String[] arrstring) {
        int n = 1;
        switch (n) {
            case 1: {
                System.out
.println(1); break; } case 5: { System.out.println(5); break; } case 6: { System.out.println(6); } } } }

可以看到,反編譯前後沒有什麼區別。就是直接比較整型的值。

Switch對字元型的支援實現細節

原始碼:

public
class SwitchTest{ public static void main(String[] args) { char b='e'; switch (b) { case 'a': System.out.println(1); break; case 'c': System.out.println(5); break; case 'e': System.out.println(6); default: break; } } }

反編譯後:

import java.io.PrintStream;
public class SwitchTest {
    public static void main(String[] arrstring) {
        int n = 101;
        switch (n) {
            case 97: {
                System.out.println(1);
                break;
            }
            case 99: {
                System.out.println(5);
                break;
            }
            case 101: {
                System.out.println(6);
            }
        }
    }
}

可以看到把char型別轉換成了ASCCI碼值,然後比對的是ASCCI碼值。

Switch對字串支援的實現細節

原始碼:

public class SwitchTest{

    public static void main(String[] args) {
    String b="love";
        switch (b) {
        case "i":
            System.out.println(1);
            break;
        case "love":
            System.out.println(5);
            break;
        case "you":
          System.out.println(6);
        default:
            break;
        }
    }
}

反編譯後:

public class SwitchTest {
    public static void main(String[] arrstring) {
        String string;
        String string2 = string = "love";
        int n = -1;
        switch (string2.hashCode()) {
            case 105: {
                if (!string2.equals("i")) break;
                n = 0;
                break;
            }
            case 3327858: {
                if (!string2.equals("love")) break;
                n = 1;
                break;
            }
            case 119839: {
                if (!string2.equals("you")) break;
                n = 2;
            }
        }
        switch (n) {
            case 0: {
                System.out.println(1);
                break;
            }
            case 1: {
                System.out.println(5);
                break;
            }
            case 2: {
                System.out.println(6);
            }
        }
    }
}

可以看到進行比對的是雜湊值,而且還進行了equals比較檢測

參考資料:

相關推薦

Java學習筆記 () 編譯 switch 觀察實現細節

看了H大的部落格之後,發現還有反編譯程式碼看實現細節的操作,學習一波,吸收營養。文末放部落格連結地址。 switch對整型支援的實現細節 原始碼,如下: public class SwitchTest{ public static void ma

Java學習筆記---類的靜態變量與靜態方法的訪問與調用方式

solved 對象 getname cannot hang variable bsp protected some 靜態變量又稱類變量,靜態方法又稱類方法,它們統稱為靜態成員或類成員。靜態成員由static修飾,是屬於整個類的,所有的對象共享這些靜態成員。不需要創建任何對象

Java學習筆記:Java的流程控制語句之循環語句

AI 介紹 可見 while 兩個 流程控制 邏輯運算 ava 表示 Java的流程控制語句之循環語句 一:Java循環語句之 while;   生活中,有些時候為了完成任務,需要重復的進行某些動作。如參加 10000 米長跑,需要繞 400 米的賽道反復的跑 25

8.3(java學習筆記)動態編譯(DynamicCompiler)與動態執行(DynamicRun)

一、動態編譯   簡單的說就是在執行一個java程式的過程中,可以通過一些API來編譯其他的Java檔案。   下面主要說動態編譯的實現:   1、獲取java編譯編譯器   2、執行編譯器(須指定編譯檔案)   獲取編譯器通過JavaCompiler ToolProvider.getSystemJ

Java學習筆記之--------IO流之字元流實現純文字拷貝

字元流 輸入流:Reader,FileReader 輸出流:Writer,FileWriter 字元流只能處理純文字,全部為可見字元(.txt或者.html)。下面實現純文字的拷貝: public class CopyFileDemo { public sta

Java基礎學習筆記 Java基礎語法之接口和多態

java cas 發現 過程 類類型 結果 覆寫 實例 new 接口 接口概念 接口是功能的集合,同樣可看做是一種數據類型,是比抽象類更為抽象的”類”。接口只描述所應該具備的方法,並沒有具體實現,具體的實現由接口的實現類(相當於接口的子類)來完成

java學習筆記):繼承

this關鍵字 log implement java學習 方式 show 使用 類型 多繼承 繼承 子類擁有父類非private的屬性,方法。 子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展。 子類可以用自己的方式實現父類的方法。 Java的繼承

Java學習筆記四:Java種基本數據類型

text 封裝 image 情況 p s 浮點數 align 不容易 字符 Java的八種基本數據類型   Java語言提供了八種基本類型。六種數字類型(四個整數型,兩個浮點型),一種字符類型,還有一種布爾型。   Java基本類型共有八種,基本類型可以分為三類,字符類

Java學習筆記七:Java的流程控制語句之switch

獎品 出現 字符型 -s png 結束 ase 選項 分享圖片 Java條件語句之 switch   當需要對選項進行等值判斷時,使用 switch 語句更加簡潔明了。例如:根據考試分數,給予前四名不同的獎品。第一名,獎勵筆記本一臺;第二名,獎勵 IPAD 2 一個

java學習筆記)-- 異常

異常體系圖 Error:描述Java執行時內部錯誤與資源耗盡錯誤(OOM,StackOverflow)應用程式不丟擲此類異常。這種內部錯誤一旦出現,除了告知使用者並使用安全終止之外,再無能為力。 Exception(程式本身錯誤):Java應用程式丟擲異常。 IOExce

Java學習筆記之——switch-case條件結構

語法: switch(變數){   case 常量1:     執行語句;     break; case 常量2:     執行語句;     break; case 常量3:     執行語句;     break; ………… default:   

Java學習筆記)——JUnit單元測試

一、JUnit Test (一)單元測試的概念 1 . 單元測試是針對最小的功能單元編寫測試程式碼 2 . Java程式最小的功能單元是方法 3 . 單元測試就是針對單個Java方法的測試 (二)測試驅動開發 測試驅動開發TDD:Test-Driven Deve

java學習筆記-設計模式之單例模式如何防止反射及序列化漏洞

在前一篇文章中,對單例模式列舉了五種實現方式。其中列舉模式擁有出生光環,天生就沒有反射及反序列化漏洞。針對其他四種實現方式,在本篇文章中對懶漢式單例模式實現進行反射及反序列化漏洞測試。 一、通過反射破解懶漢式單例模式 重新建立測試類TestClientNew,通過反射獲取

Hadoop 學習筆記 任務遠端提交--Java遠端提交

Hadoop執行計算任務,大概有以下幾種方式 把MapReduce任務打包到jar裡,上傳到伺服器,用命令列啟動 通過Java向Hadoop叢集提交MapReduce任務 伺服器的hadoop配置拷

Java併發學習筆記()-LinkedBlockingQueue

LinkedBlockingQueue是由連結串列組成的阻塞佇列,先來看demo public class LinkedBlockingQueueDemo { public static void main(String[] args) { ExecutorServ

Java學習筆記2:使用replaceAll()方法替換字串中的斜槓:左斜槓(\)和右斜槓(/)

       在程式設計過程中,需要將一個字串中的反斜槓(\)全部替換成(\\),很簡單的操作但是很容易報錯。        比如:String filePath  =  "D:\daxiang\te

Java SE 學習筆記()

1.      繼承  : a)        繼承在生活中是一種  is a 的關係(Student is a person) b)       在Java中, 繼承的關係用extends 關鍵字表示 c)        在繼承體系中 :  被繼承的類稱為父類(基類

Java學習筆記(十三)--序列化、序列化與無參建構函式

概念序列化:將物件儲存到磁碟中,或允許在網路中直接傳輸物件,物件序列化機制允許把記憶體中的Java物件轉換成平臺無關的二進位制,從而可以持久的儲存在磁碟上,也可以在網路中傳輸。反序列化:程式一旦獲得了序

Java學習筆記-如何配置Sublime Text來編譯Java及import路徑包

1.關於Sublime Text 筆者使用的是Sublime Text 3,作為一個一款輕量級的文字編輯器, 整體來說還是很不錯的. 不過有些配置還是相當坑的, 至少配置執行Java還是有點坑的, 筆者花了大半個下午才折騰明白, 今天就先和大家分享一下配置Su

【Linux學習筆記】Linux程式設計-編譯(gcc)與除錯(gdb)

【注】文章中的所有截圖均為centos下實驗結果,親測命令正確= ̄ω ̄= 【參考資料】《Linux從入門到精通(第2版)》劉憶智 等編著 1、編譯一個C程式:以用vim寫成的summa