欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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的設置了默認值為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的設置了默認值為key + CoreConstants.UNDEFINED_PROPERTY_SUFFIX),即key_IS_UNDEFINED,注意這里如果defaultValue不為null則不走IS_UNDEFINED的邏輯,即空字符串也是可以的。對于自定義appender需要注意一下appender屬性的value處理邏輯。

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

相關文章

  • 詳解Java中ByteArray字節(jié)數(shù)組的輸入輸出流的用法

    詳解Java中ByteArray字節(jié)數(shù)組的輸入輸出流的用法

    ByteArrayInputStream和ByteArrayOutputStream分別集成自InputStream和OutputStream這兩個輸入和輸出流,這里我們就來詳解Java中ByteArray字節(jié)數(shù)組的輸入輸出流的用法,需要的朋友可以參考下
    2016-06-06
  • Spring如何將bean添加到容器中

    Spring如何將bean添加到容器中

    這篇文章主要介紹了Spring如何將bean添加到容器中,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • 全面了解Java反射機制

    全面了解Java反射機制

    Java的反射機制在實踐中可謂無處不在,如果你已經(jīng)工作幾年,還對Java的反射機制一知半解,那么這篇文章絕對值得你讀一讀。
    2020-03-03
  • mybatis-plus如何禁用一級緩存的方法

    mybatis-plus如何禁用一級緩存的方法

    這篇文章主要介紹了mybatis-plus如何禁用一級緩存的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 優(yōu)雅地在Java 8中處理異常的方法詳解

    優(yōu)雅地在Java 8中處理異常的方法詳解

    異常處理是我們在日常開發(fā)中經(jīng)常會遇到的一種需求,下面這篇文章主要給大家介紹了關于如何優(yōu)雅地在Java 8中處理異常的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們來一起看看吧
    2019-01-01
  • Java代碼實踐12306售票算法(二)

    Java代碼實踐12306售票算法(二)

    這篇文章主要介紹了Java代碼實踐12306售票算法(二)的相關資料,需要的朋友可以參考下
    2016-02-02
  • Maven?Settings.xml的基本語法詳解

    Maven?Settings.xml的基本語法詳解

    這篇文章主要為大家介紹了Maven?Settings.xml的基本語法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 簡單了解Java方法的定義和使用實現(xiàn)

    簡單了解Java方法的定義和使用實現(xiàn)

    這篇文章主要給大家介紹了關于Java中方法使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-06-06
  • 深入理解jvm啟動參數(shù)

    深入理解jvm啟動參數(shù)

    JVM的啟動參數(shù)是在啟動JVM時可以設置的一些命令行參數(shù),本文詳細的介紹了深入理解jvm啟動參數(shù),具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • Java 使用POI生成帶聯(lián)動下拉框的excel表格實例代碼

    Java 使用POI生成帶聯(lián)動下拉框的excel表格實例代碼

    本文通過實例代碼給大家分享Java 使用POI生成帶聯(lián)動下拉框的excel表格,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-09-09

最新評論