日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java中的条件编译

發(fā)布時間:2025/3/21 java 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的条件编译 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在代碼中添加大量log,對于CPU和內(nèi)存的影響如何,會不會降低性能?相信有不少人對此有疑問,本文將詳細解答該問題。

一、概述

條件編譯是指源程序的代碼行,可以在滿足一定條件的情況下才進行編譯,而未選中的源碼,不會生成中間碼或機器碼,即部分內(nèi)容參與編譯。

條件編譯的好處:對于不同硬件平臺或者軟件平臺,或者不同功能模塊的代碼,編寫到在同一個源文件,從而方便程序的維護和移植。

很多程序設(shè)計語言都提供條件編譯的功能,比如C/++c采用預(yù)處理器指示符來達到條件編譯。而Java語言并沒有提供直接的預(yù)處理器,那么Java是不是就沒有條件編譯呢?先告訴大家,答案是Java存在條件編譯,在這之前先說說C/C++的條件編譯。

二、C/C++條件編譯

對于C/C++,常見的預(yù)處理指令:

#include?引入源代碼文件 #define?宏定義 #undef?取消已存在的宏定義 #if?如果條件為真,則編譯后面的代碼 #ifdef?如果宏已定義,則編譯后面的代碼 #ifndef?如果宏未定義,則編譯后面的代碼 #elif?如果前面的#if條件為假,并且當(dāng)前條件為真,則編譯后面的代碼 #endif?結(jié)束前面的#if……#else條件編譯語句塊

條件編譯常見形式:

(1) 當(dāng)通過#define已定義過該 標(biāo)識符,則程序編譯階段會選擇編譯代碼段1,否則編譯代碼段2

#ifdef?標(biāo)識符代碼段1 #else代碼段2 #endif

(2) 當(dāng)通過#define未定義過該 標(biāo)識符,則程序編譯階段會選擇編譯代碼段1,否則編譯代碼段2。功能正好與(1)相反

#ifndef?標(biāo)識符代碼段1 #else代碼段2 #endif

(3) 當(dāng) 表達式為真,則程序編譯階段會選擇編譯代碼段1,否則編譯代碼段2

#if?表達式代碼段1 #else代碼段2 #endif

三、Java條件編譯

Java語法的條件編譯,是通過判斷條件為常量的if語句實現(xiàn)的。其原理是Java語言的語法糖,根據(jù)if判斷條件的真假,編譯器直接把分支為false的代碼塊消除。通過該方式實現(xiàn)的條件編譯,必須在方法體內(nèi)實現(xiàn),而無法在正整個Java類的結(jié)構(gòu)或者類的屬性上進行條件編譯,這與C/C++的條件編譯相比,確實更有局限性。在Java語言設(shè)計之初并沒有引入條件編譯的功能,雖有局限,但是總比沒有更強。

反編譯分析技術(shù):

對于Debug.java文件,執(zhí)行:

javac Debug.java //編譯后 生成Debug.class文件 javap -c Debug.class //通過javap,反編譯class文件

接下來,展開幾項對比分析:

3.1 final對比

該對比項是針對是否采用final變量與非final變量的對比:

源碼:

// 空方法 public?void?voidMethod(){}//final常量 private final boolean FINAL_FLAG_FALSE = false; public?void?constantFalseFlag(){if(FLAG_FALSE){System.out.println("debug log...");} }// 非final private boolean falseFlag= false; public?void?falseFlag(){if(falseFlag){System.out.println("debug log...");} }

反編譯解析后的結(jié)果如下:

// 空方法 public?void?voidMethod();Code:0: return//final常量 public?void?constantFalseFlag();Code:0: return// 非final public?void?falseFlag();Code:0: aload_01: getfield #3 // Field falseFlag:Z4: ifeq 157: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;10: ldc #6 // String debug log...12: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V15: return

從反編譯的Code字段,可以看出constantFalseFlag()方法體內(nèi)的內(nèi)容經(jīng)過編譯后,對于常量false分支,是不可達分支,則在編譯成class字節(jié)碼文件時剪出該分支,最終效果等價于voidMethod()。而對于falseFlag()方法,則多了5條指令。

可見,對于常量為false的if語句,由于恒為false,等同于條件編譯的功能。

另外除了反編譯的方式來對比分析,如果不了解反編譯后的語法,還可以簡單地對比編譯后的.Class文件的大小,也會發(fā)現(xiàn)if(false){}內(nèi)部的代碼塊會自動剪除。

from:?http://gityuan.com/2015/07/26/java-condition-compile/?

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Java中的条件编译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。