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

logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀

 更新時間:2023年11月07日 10:00:37   作者:codecraft  
這篇文章主要為大家介紹了logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

本文主要研究一下logback的UNDEFINED_PROPERTY

substVars

ch/qos/logback/core/util/OptionHelper.java

public static String substVars(String input, PropertyContainer pc0, PropertyContainer pc1) {
        try {
            return NodeToStringTransformer.substituteVariable(input, pc0, pc1);
        } catch (ScanException e) {
            throw new IllegalArgumentException("Failed to parse input [" + input + "]", e);
        }
    }
OptionHelper提供了substVars方法,它執(zhí)行NodeToStringTransformer的substituteVariable方法

substituteVariable

ch/qos/logback/core/subst/NodeToStringTransformer.java

public static String substituteVariable(String input, PropertyContainer pc0, PropertyContainer pc1) throws ScanException {
        Node node = tokenizeAndParseString(input);
        NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, pc0, pc1);
        return nodeToStringTransformer.transform();
    }
substituteVariable方法則先根據(jù)input解析node,再創(chuàng)建NodeToStringTransformer,執(zhí)行其transform方法

transform

ch/qos/logback/core/subst/NodeToStringTransformer.java

public String transform() throws ScanException {
        StringBuilder stringBuilder = new StringBuilder();
        compileNode(node, stringBuilder, new Stack<Node>());
        return stringBuilder.toString();
    }
transform方法主要是執(zhí)行compileNode,通過stringBuilder來收集變量值

compileNode

ch/qos/logback/core/subst/NodeToStringTransformer.java

private void compileNode(Node inputNode, StringBuilder stringBuilder, Stack<Node> cycleCheckStack) throws ScanException {
        Node n = inputNode;
        while (n != null) {
            switch (n.type) {
            case LITERAL:
                handleLiteral(n, stringBuilder);
                break;
            case VARIABLE:
                handleVariable(n, stringBuilder, cycleCheckStack);
                break;
            }
            n = n.next;
        }
    }
compileNode方法針對VARIABLE類型的執(zhí)行handleVariable方法

handleVariable

ch/qos/logback/core/subst/NodeToStringTransformer.java

private void handleVariable(Node n, StringBuilder stringBuilder, Stack<Node> cycleCheckStack) throws ScanException {
        // Check for recursion
        if (haveVisitedNodeAlready(n, cycleCheckStack)) {
            cycleCheckStack.push(n);
            String error = constructRecursionErrorMessage(cycleCheckStack);
            throw new IllegalArgumentException(error);
        }
        cycleCheckStack.push(n);
        StringBuilder keyBuffer = new StringBuilder();
        Node payload = (Node) n.payload;
        compileNode(payload, keyBuffer, cycleCheckStack);
        String key = keyBuffer.toString();
        String value = lookupKey(key);
        // empty values are considered valid
        if (value != null) {
            Node innerNode = tokenizeAndParseString(value);
            compileNode(innerNode, stringBuilder, cycleCheckStack);
            cycleCheckStack.pop();
            return;
        }
        // empty default literal is a valid value
        if (n.defaultPart == null) {
            stringBuilder.append(key + CoreConstants.UNDEFINED_PROPERTY_SUFFIX);
            cycleCheckStack.pop();
            return;
        }
        Node defaultPart = (Node) n.defaultPart;
        StringBuilder defaultPartBuffer = new StringBuilder();
        compileNode(defaultPart, defaultPartBuffer, cycleCheckStack);
        cycleCheckStack.pop();
        String defaultVal = defaultPartBuffer.toString();
        stringBuilder.append(defaultVal);
    }

 handleVariable方法對于value為null,且defaultValue也為null的設(shè)置了默認值為key + CoreConstants.UNDEFINED_PROPERTY_SUFFIX)

UNDEFINED_PROPERTY_SUFFIX

public class CoreConstants {
    //......
    public static final String UNDEFINED_PROPERTY_SUFFIX = "_IS_UNDEFINED";
}
UNDEFINED_PROPERTY_SUFFIX的值為_IS_UNDEFINED

小結(jié)

logback通過NodeToStringTransformer的handleVariable來獲取變量值,若該value為null,且defaultValue也為null的設(shè)置了默認值為key + CoreConstants.UNDEFINED_PROPERTY_SUFFIX),即key_IS_UNDEFINED,注意這里如果defaultValue不為null則不走IS_UNDEFINED的邏輯,即空字符串也是可以的。對于自定義appender需要注意一下appender屬性的value處理邏輯。

以上就是logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀的詳細內(nèi)容,更多關(guān)于logback UNDEFINED_PROPERTY的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java使用Cipher類實現(xiàn)加密的過程詳解

    Java使用Cipher類實現(xiàn)加密的過程詳解

    這篇文章主要介紹了Java使用Cipher類實現(xiàn)加密的過程詳解,Cipher類提供了加密和解密的功能,創(chuàng)建密匙主要使用SecretKeySpec、KeyGenerator和KeyPairGenerator三個類來創(chuàng)建密匙。感興趣可以了解一下
    2020-07-07
  • java拷貝指定目錄下所有內(nèi)容到minIO代碼實例

    java拷貝指定目錄下所有內(nèi)容到minIO代碼實例

    這篇文章主要介紹了java拷貝指定目錄下所有內(nèi)容到minIO代碼實例,創(chuàng)建桶 直接使用工具類先判斷,再創(chuàng)建即可,創(chuàng)建文件夾,需要注意以"/"結(jié)尾,實際也是在minIO上創(chuàng)建文件,只是作為目錄的表現(xiàn)形式展示,需要的朋友可以參考下
    2024-01-01
  • Java 8日期處理LocalDateTime時區(qū)轉(zhuǎn)換的3大誤區(qū)與解決方案

    Java 8日期處理LocalDateTime時區(qū)轉(zhuǎn)換的3大誤區(qū)與解決方案

    文章介紹了Java 8中的日期時間API,包括`LocalDateTime`、`ZonedDateTime`和`Instant`等核心類,以及它們在不同場景下的應用,文章還探討了常見誤區(qū),本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • java 中歸并排序算法詳解

    java 中歸并排序算法詳解

    這篇文章主要介紹了java 中歸并排序算法詳解的相關(guān)資料,歸并排序算法又稱為合并排序算法,是一種時間復雜度為O(N logN)的排序算法,因而其在平常生活工作中應用非常廣泛,需要的朋友可以參考下
    2017-09-09
  • 淺談Maven 項目中依賴的搜索順序

    淺談Maven 項目中依賴的搜索順序

    這篇文章主要介紹了淺談Maven 項目中依賴的搜索順序,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • java生成驗證碼圖片的方法

    java生成驗證碼圖片的方法

    這篇文章主要為大家詳細介紹了java生成驗證碼圖片的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • Java中List.sort()自定義排序規(guī)則幾種方式

    Java中List.sort()自定義排序規(guī)則幾種方式

    Java中可通過Comparator匿名類、Lambda表達式、靜態(tài)方法、自定義對象及實現(xiàn)Comparable接口實現(xiàn)List排序,這篇文章主要介紹了Java中List.sort()自定義排序規(guī)則幾種方式,需要的朋友可以參考下
    2025-06-06
  • Java中常見的查找算法與排序算法總結(jié)

    Java中常見的查找算法與排序算法總結(jié)

    數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)存儲的方式,算法是數(shù)據(jù)計算的方式。所以在開發(fā)中,算法和數(shù)據(jù)結(jié)構(gòu)息息相關(guān)。本文為大家整理了Java中常見的查找與排序算法的實現(xiàn),需要的可以參考一下
    2023-03-03
  • Java中SpringBoot的TCC事務(wù)詳解

    Java中SpringBoot的TCC事務(wù)詳解

    這篇文章主要介紹了Java中SpringBoot的TCC事務(wù)詳解,近年來,隨著微服務(wù)架構(gòu)的普及,TCC?事務(wù)成為了一種非常流行的分布式事務(wù)解決方案,在?Spring?Boot?中,我們可以很容易地使用?TCC?事務(wù)來管理分布式事務(wù),需要的朋友可以參考下
    2023-07-07
  • Springboot之restTemplate配置及使用方式

    Springboot之restTemplate配置及使用方式

    這篇文章主要介紹了Springboot之restTemplate配置及使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04

最新評論

加查县| 蓝山县| 嘉义县| 永城市| 青州市| 凤庆县| 丹凤县| 阿拉善盟| 广汉市| 绿春县| 通州区| 长子县| 呼图壁县| 利津县| 凤凰县| 左权县| 石河子市| 罗甸县| 南木林县| 康保县| 交城县| 德格县| 湘乡市| 合山市| 镇巴县| 长岛县| 长治市| 林口县| 安吉县| 南开区| 灌南县| 博兴县| 无棣县| 柘城县| 磐石市| 宁晋县| 兴山县| 嘉鱼县| 襄樊市| 板桥市| 临沭县|