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