我遇到了一個我想理解的奇怪問題。如果有人有一個解決方案,那就太好了,但我實際上正在尋找理解為什么會發生這種情況:我編寫了一個自定義 Logback 布局。我正在擴展ch.qos.logback.contrib.json.classic.JsonLayout和覆蓋addCustomDataToJsonMap。如果在日志記錄事件參數列表中找到某種類型的參數,我想添加其他屬性: protected void addCustomDataToJsonMap(Map<String, Object> map, ILoggingEvent event) { if (event.getArgumentArray() == null) { return; } for (Object argument : event.getArgumentArray()) { System.out.println(argument.getClass().getClassLoader()); // 1 System.out.println(JsonAttribute.class.getClassLoader()); // 2但是參數列表 (1) 中的對象的類和靜態引用的對象的類 (2) 由不同的類加載器加載,如輸出所示:org.springframework.boot.devtools.restart.classloader.RestartClassLoader@618157b2sun.misc.Launcher$AppClassLoader@18b4aac2因此,我無法將對象轉換為所需的類型并訪問其方法。我想到的解決方法是通過Reflecion 訪問這些值,但我寧愿使用實際值。我想這只是我的開發環境的問題,但正如第一部分所述,我真的很想了解發生了什么。編輯:正如預期的那樣:當在沒有 spring 開發工具的情況下以“生產”模式運行應用程序時,所有類都由同一個類加載器加載。
1 回答

九州編程
TA貢獻1785條經驗 獲得超4個贊
我假設您正在使用 Spring DevTools。他們創建一個單獨的類加載器以更快地重新啟動應用程序。該類加載器應該加載您的類,并在重新啟動時被丟棄,而不是重新啟動整個應用程序。
您應該能夠將其配置為排除自定義 Logback 布局,以便在應用程序重新啟動時不會重新加載它(鏈接文檔中的第 20.2.6 節)。
添加回答
舉報
0/150
提交
取消