最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java中$符的各種使用場(chǎng)景

 更新時(shí)間:2023年04月25日 11:05:55   作者:G探險(xiǎn)者  
在Java編程中,我們會(huì)經(jīng)??吹?符的身影,比如經(jīng)常在配置文件中看到$符號(hào)作為變量占位符,用于在運(yùn)行時(shí)動(dòng)態(tài)地獲取變量值。本文將詳細(xì)介紹$符號(hào)在Java編程中的各種應(yīng)用場(chǎng)景,以幫助您更好地理解和運(yùn)用這個(gè)符號(hào),感興趣的小伙伴可以收藏一下

前言

在Java編程中,我們會(huì)經(jīng)常看到$符的身影

比如經(jīng)常在配置文件中看到$符號(hào)作為變量占位符,用于在運(yùn)行時(shí)動(dòng)態(tài)地獲取變量值。

這種做法有助于提高代碼的靈活性和可維護(hù)性。除了在配置文件中使用$符號(hào)外,我們還會(huì)在其他場(chǎng)景中遇到這個(gè)符號(hào),例如內(nèi)部類(lèi)、Lambda表達(dá)式、自動(dòng)生成的代碼等。

接下來(lái),我將詳細(xì)介紹$符號(hào)在Java編程中的各種應(yīng)用場(chǎng)景,以幫助您更好地理解和運(yùn)用這個(gè)符號(hào)。

1. $符號(hào)七大應(yīng)用場(chǎng)景

1.1 內(nèi)部類(lèi)與匿名內(nèi)部類(lèi)

在Java中,當(dāng)一個(gè)類(lèi)被定義在另一個(gè)類(lèi)的內(nèi)部時(shí),它被稱(chēng)為內(nèi)部類(lèi)。在編譯之后,內(nèi)部類(lèi)的字節(jié)碼文件名將包含外部類(lèi)名、$符號(hào)和內(nèi)部類(lèi)名。例如,如果我們有一個(gè)名為Outer的外部類(lèi)和一個(gè)名為Inner的內(nèi)部類(lèi),那么編譯后的字節(jié)碼文件名為:Outer$Inner.class。同樣,當(dāng)我們創(chuàng)建匿名內(nèi)部類(lèi)時(shí),編譯器會(huì)為其生成一個(gè)類(lèi)名,該類(lèi)名包含外部類(lèi)名、$符號(hào)以及一個(gè)編譯器生成的數(shù)字序列,例如:Outer$1.class。

1.2 Lambda表達(dá)式與方法引用

從Java 8開(kāi)始,Lambda表達(dá)式和方法引用成為了Java編程的重要組成部分。當(dāng)編譯器處理Lambda表達(dá)式和方法引用時(shí),它會(huì)生成包含$符號(hào)的特殊方法名。例如,考慮以下Lambda表達(dá)式:

Runnable r = () -> System.out.println("Hello, world!");

編譯后,將生成一個(gè)名為lambda$main$0的方法。在這種情況下,$符號(hào)用于區(qū)分由編譯器生成的Lambda表達(dá)式方法和其他程序中的方法。

1.3. 自動(dòng)生成的字段與方法

在某些情況下,Java編譯器會(huì)為我們自動(dòng)生成一些字段和方法,這些字段和方法的名字可能包含$符號(hào)。例如,當(dāng)我們使用枚舉類(lèi)型(Enum)時(shí),編譯器會(huì)為枚舉類(lèi)生成一個(gè)名為$VALUES的靜態(tài)字段,以及一個(gè)名為valueOf的靜態(tài)方法。同樣,當(dāng)我們使用switch語(yǔ)句與枚舉類(lèi)型結(jié)合時(shí),編譯器會(huì)生成一個(gè)包含$符號(hào)的方法,用于實(shí)現(xiàn)對(duì)應(yīng)的switch邏輯。

1.4. 自定義類(lèi)名與變量名

雖然在Java編程中,通常不建議使用$符號(hào)作為類(lèi)名或變量名的一部分,但這是允許的。例如,以下代碼是有效的Java代碼:

class MyClass$1 {
    int $value = 42;
}

然而,由于這種命名方法可能引起混淆,因此在實(shí)際編程中應(yīng)該避免這樣做。

1.5. 生成的代碼和工具

在某些情況下,代碼生成工具(如AspectJ,JAXB等)和字節(jié)碼處理庫(kù)(如ASM,CGLIB等)可能會(huì)在生成的類(lèi)名、方法名或字段名中使用$符號(hào)。這是因?yàn)?符號(hào)在這些場(chǎng)景下能夠提供一種有效的命名約定,避免與原始代碼中的名稱(chēng)發(fā)生沖突。

1.6. 貨幣計(jì)算

在Java程序中,我們可能會(huì)使用BigDecimal或其他數(shù)據(jù)類(lèi)型處理貨幣計(jì)算。在某些情況下,我們可以使用$符號(hào)作為貨幣值的前綴,以表示貨幣單位。雖然這不是Java語(yǔ)言的內(nèi)置功能,但是可以作為一種編程約定來(lái)使用,以提高代碼的可讀性。

BigDecimal salary = new BigDecimal("5000.00");
BigDecimal bonus = new BigDecimal("1000.00");
BigDecimal total = salary.add(bonus);
System.out.println("Total: $" + total);

雖然這里的$符號(hào)并不是Java語(yǔ)言特性,但它在表示貨幣值時(shí)可以幫助提高代碼的可讀性。

1.7 在配置文件中動(dòng)態(tài)獲取變量值

在Java應(yīng)用程序中,我們經(jīng)常需要使用配置文件來(lái)存儲(chǔ)和管理應(yīng)用程序的設(shè)置。在許多情況下,配置文件會(huì)使用$符號(hào)作為占位符,用于動(dòng)態(tài)獲取變量值。以下是一些常見(jiàn)的配置文件格式和$符號(hào)的使用示例:

1.7.1 Java屬性文件(.properties)

Java屬性文件是一種簡(jiǎn)單的鍵值存儲(chǔ)格式。在屬性文件中,我們可以使用${key}的形式作為占位符,表示需要從其他地方獲取值。

database.url = jdbc:mysql://${host}:${port}/${dbName}

在這個(gè)例子中,${host}、${port}和${dbName}是占位符,它們將在運(yùn)行時(shí)被相應(yīng)的值替換。

1.7.2 Spring Boot配置文件(application.yml 或 application.properties)

在Spring Boot應(yīng)用程序中,我們通常使用YAML或?qū)傩晕募?lái)配置應(yīng)用程序。在這些文件中,我們可以使用$符號(hào)和大括號(hào)來(lái)表示占位符。

server:
  port: ${app.port:8080}

在這個(gè)例子中,${app.port:8080}表示一個(gè)占位符,其值將在運(yùn)行時(shí)從環(huán)境變量或其他配置源中獲取。如果沒(méi)有找到該值,將使用默認(rèn)值8080。

1.7.3 Apache Maven POM文件(pom.xml)

Apache Maven是一種流行的Java構(gòu)建工具。在Maven的POM文件中,我們可以使用$符號(hào)和大括號(hào)來(lái)表示占位符。

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
</properties>

在這個(gè)例子中,${java.version}表示一個(gè)占位符,其值將在運(yùn)行時(shí)從其他地方獲取。

1.7.4 Java模板引擎(如Thymeleaf, FreeMarker, Velocity等)

在Java Web應(yīng)用程序中,我們經(jīng)常使用模板引擎來(lái)渲染HTML頁(yè)面。許多模板引擎都支持使用$符號(hào)作為占位符,用于動(dòng)態(tài)獲取變量值。

<!-- Thymeleaf 示例 -->
<p th:text="${message}"></p>

<!-- FreeMarker 示例 -->
<p>${message}</p>

<!-- Velocity 示例 -->
<p>$message</p>

在這些例子中,$符號(hào)用于動(dòng)態(tài)插入變量message的值。

1.7.5 Log4j2 配置文件中動(dòng)態(tài)獲取變量值

Log4j2是一個(gè)流行的Java日志框架,用于記錄應(yīng)用程序的運(yùn)行狀況。在Log4j2的配置文件中,我們可以使用$符號(hào)和大括號(hào)作為占位符,用于動(dòng)態(tài)獲取變量值。以下是一個(gè)Log4j2配置文件(log4j2.xml)的示例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="logPath">${sys:user.home}/logs</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <RollingFile name="RollingFile" fileName="${logPath}/app.log" filePattern="${logPath}/app-%d{yyyy-MM-dd}.log.gz">
            <PatternLayout>
                <pattern>%d %p %c{1.} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console" />
            <AppenderRef ref="RollingFile" />
        </Root>
    </Loggers>
</Configuration>

在這個(gè)例子中,我們使用${sys:user.home}作為占位符,表示用戶主目錄。在運(yùn)行時(shí),這個(gè)占位符將被相應(yīng)的系統(tǒng)屬性值替換。同時(shí),我們還定義了一個(gè)名為logPath的自定義屬性,它的值為${sys:user.home}/logs。在配置文件的其他部分,我們可以使用${logPath}來(lái)引用這個(gè)屬性。

2. 在配置文件中$符號(hào)來(lái)獲取變量值的原理

在配置文件中使用$符號(hào)獲取變量值,其背后的原理主要包括解析占位符、變量替換和值來(lái)源。以下是詳細(xì)說(shuō)明:

  • 解析占位符: 配置文件中的占位符通常以$符號(hào)開(kāi)頭,后跟一對(duì)大括號(hào)({}),括號(hào)內(nèi)包含變量名。例如,${variable}。在加載配置文件時(shí),解析器會(huì)識(shí)別這種格式的占位符,并提取其中的變量名。
  • 變量替換: 解析器識(shí)別并提取占位符后,需要在運(yùn)行時(shí)將其替換為實(shí)際的變量值。具體的替換過(guò)程取決于配置文件的格式和使用的庫(kù)。例如,Java屬性文件的解析器可能使用java.util.Properties類(lèi)來(lái)完成變量替換,而Spring Boot配置文件的解析器可能使用Spring框架提供的PropertySourcesPlaceholderConfigurer類(lèi)來(lái)完成替換。
  • 值來(lái)源: 變量值的來(lái)源可能有多種,例如環(huán)境變量、系統(tǒng)屬性、外部配置文件等。解析器需要知道在哪里查找變量值。這通常是通過(guò)配置文件解析器的特性或規(guī)則來(lái)實(shí)現(xiàn)的。例如,在Java屬性文件中,解析器可能首先查找系統(tǒng)屬性,然后查找環(huán)境變量;而在Spring Boot配置文件中,解析器會(huì)按照特定的順序查找多個(gè)PropertySource,這些PropertySource可以來(lái)自環(huán)境變量、系統(tǒng)屬性、配置文件等。
  • 默認(rèn)值和條件替換: 在某些情況下,配置文件解析器還支持為占位符提供默認(rèn)值或進(jìn)行條件替換。例如,Spring Boot的配置文件解析器允許我們使用:符號(hào)為占位符指定默認(rèn)值,如${variable:defaultValue}。如果在運(yùn)行時(shí)找不到variable的值,解析器將使用defaultValue作為替換值。此外,Spring Boot還支持@Conditional注解,這允許我們根據(jù)條件選擇性地應(yīng)用配置。

3. 為什么要是用$符而不使用別的符號(hào)

在配置文件中使用$符號(hào)作為變量占位符的原因可以從歷史、約定和可讀性等方面來(lái)解釋。

  • 歷史原因: Unix和Linux操作系統(tǒng)中,環(huán)境變量的表示方法是以美元符號(hào)($)作為前綴,例如$PATH。這種表示法在很大程度上影響了其他技術(shù)的設(shè)計(jì),包括各種配置文件格式。在很多配置文件中沿用$符號(hào)作為變量占位符,這是受到了Unix和Linux環(huán)境變量表示法的影響。
  • 約定俗成: 多年來(lái),程序員們?cè)诟鞣N配置文件和模板引擎中使用$符號(hào)作為變量占位符。這已經(jīng)成為一種廣泛接受的編程慣例。當(dāng)大多數(shù)開(kāi)發(fā)者都習(xí)慣于這種表示法時(shí),繼續(xù)使用$符號(hào)可以降低學(xué)習(xí)曲線,使新的配置文件格式更容易被接受。
  • 可讀性: 在實(shí)際編程中,可讀性是一個(gè)重要的考慮因素。$符號(hào)在許多編程語(yǔ)言和配置文件中具有特殊含義,它很容易引起開(kāi)發(fā)者的注意。使用$符號(hào)作為占位符可以提高配置文件的可讀性,有助于開(kāi)發(fā)者快速理解代碼的含義。
  • 避免沖突: 配置文件中的變量占位符需要使用一種不容易與其他文本內(nèi)容混淆的符號(hào)。$符號(hào)在很多編程語(yǔ)言中具有特殊含義,因此在配置文件中使用$符號(hào)作為變量占位符可以減少與其他字符的沖突。

小結(jié)

總之,配置文件中$符號(hào)獲取變量值的原理涉及到解析占位符、變量替換和值來(lái)源。通過(guò)在配置文件中使用$符號(hào)作為占位符,我們可以實(shí)現(xiàn)動(dòng)態(tài)配置管理,從而提高代碼的可讀性和可維護(hù)性。不同的配置文件格式和庫(kù)可能有不同的實(shí)現(xiàn)細(xì)節(jié),但其背后的基本原理是相似的。

盡管$符號(hào)在配置文件中作為變量占位符有一定的優(yōu)勢(shì),但并非所有的配置文件格式都使用$符號(hào)。有些配置文件可能會(huì)選擇其他符號(hào)或表示法,這主要取決于設(shè)計(jì)者的偏好和目標(biāo)。然而,在許多流行的配置文件和模板引擎中,$符號(hào)已經(jīng)成為一種廣泛使用的占位符。

以上就是詳解Java中$符的各種使用場(chǎng)景的詳細(xì)內(nèi)容,更多關(guān)于Java $符的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼

    java實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼

    這篇文章主要介紹了java實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 淺談mybatis中的#和$的區(qū)別

    淺談mybatis中的#和$的區(qū)別

    下面小編就為大家?guī)?lái)一篇淺談mybatis中的#和$的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • SpringBoot整合MinIO實(shí)現(xiàn)文件上傳的方法詳解

    SpringBoot整合MinIO實(shí)現(xiàn)文件上傳的方法詳解

    一般涉及到文件上傳,基本上都是保存在項(xiàng)目本地,這種方式比較省事,但是安全性不高。所以今天給大伙詳細(xì)介紹一些如何利用MinIO實(shí)現(xiàn)文件上傳,感興趣的可以了解一下
    2022-05-05
  • Springboot靜態(tài)資源訪問(wèn)實(shí)現(xiàn)代碼解析

    Springboot靜態(tài)資源訪問(wèn)實(shí)現(xiàn)代碼解析

    這篇文章主要介紹了Springboot靜態(tài)資源訪問(wèn)實(shí)現(xiàn)代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 靈活控制任務(wù)執(zhí)行時(shí)間的Cron表達(dá)式范例

    靈活控制任務(wù)執(zhí)行時(shí)間的Cron表達(dá)式范例

    這篇文章主要為大家介紹了靈活控制任務(wù)執(zhí)行時(shí)間的Cron表達(dá)式范例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • SpringSecurity多表多端賬戶登錄的實(shí)現(xiàn)

    SpringSecurity多表多端賬戶登錄的實(shí)現(xiàn)

    本文主要介紹了SpringSecurity多表多端賬戶登錄的實(shí)現(xiàn)
    2024-05-05
  • SpringBoot框架aop切面的execution表達(dá)式解讀

    SpringBoot框架aop切面的execution表達(dá)式解讀

    這篇文章主要介紹了SpringBoot框架aop切面的execution表達(dá)式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • idea神級(jí)插件及如何安裝Bito插件【Bito-ChatGPT】

    idea神級(jí)插件及如何安裝Bito插件【Bito-ChatGPT】

    這篇文章主要介紹了介紹一款idea神級(jí)插件【Bito-ChatGPT】,Bito插件的強(qiáng)大之處在于它可以幫助開(kāi)發(fā)人員更快地提交代碼,同時(shí)還提供了一些有用的功能,如自動(dòng)補(bǔ)全提交信息、快速查看歷史記錄等,需要的朋友可以參考下
    2023-04-04
  • 解讀JDK、JRE、JVM的區(qū)別與聯(lián)系

    解讀JDK、JRE、JVM的區(qū)別與聯(lián)系

    這篇文章主要介紹了解讀JDK、JRE、JVM的區(qū)別與聯(lián)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • java如何導(dǎo)出insert語(yǔ)句并生成sql腳本

    java如何導(dǎo)出insert語(yǔ)句并生成sql腳本

    這篇文章主要介紹了java導(dǎo)出insert語(yǔ)句并生成sql腳本的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論

扬州市| 泾源县| 沙洋县| 郸城县| 海晏县| 九江市| 武宣县| 类乌齐县| 会同县| 清徐县| 扬州市| 宁晋县| 八宿县| 浦县| 峨眉山市| 元阳县| 昌邑市| 江西省| 玉树县| 陆丰市| 内丘县| 治县。| 怀仁县| 南部县| 金乡县| 屏东县| 明溪县| 桂平市| 东乌珠穆沁旗| 永德县| SHOW| 来宾市| 黎平县| 嘉善县| 平安县| 河北区| 株洲市| 天全县| 昭通市| 晋州市| 佳木斯市|