簡體   English   中英

在類的私有靜態最終變量中使用動態類名

[英]Use dynamic class name in private static final variable of a class

考慮並舉例如下:

public class LoggerTestClass {
    private static final Logger LOGGER = Logger.getLogger(LoggerTestClass.class);
}

在上面的示例中,傳遞給getLogger方法的參數是硬編碼的,即LoggerTestClass.class現在,每次更改類名時,都必須更改getLogger方法的參數。

任何其他將自動獲取類名的方法,例如對於非靜態變量,我們可以添加this.getClass()

您可以使用Lombok以干凈的方式實現它。 您需要做的就是將@Log放在類的頂部,它將為您提供一個可以使用的log對象。 在這里閱讀更多

兄弟,首先,我們需要弄清楚一些概念。

在Java中,如果標識符是類的成員,並且用'static'關鍵字修飾,則其值在編譯階段確定。

如果添加了'final'關鍵字,則標識符為常數,它的值必須聲明為初始值。並且該值在Java運行時中不能更改。

有趣的是,靜態常量僅在類內部聲明,可以稱為“類名” +“”。 ,但與類上下文無關。 如果沒有上下文,則標識符不會變為動態。

我認為,如果讓標識符變成動態的,則只有兩種方法:

  1. 讓標識符成為變量。刪除``final''關鍵字。代碼如下所示:

     class Test { private static Logger LOGGER; public Test() { LOGGER = Logger.getLogger(getClass().getSimpleName()); } } 

    如果您不希望其他類訪問它,那么“ private”關鍵字就足夠了。

  2. 嘗試使用Java動態代理。 它可以在Java運行時中更改類。

碼開心〜

歡迎與我交談〜

可以使用Java 9+嗎? 然后解決方案非常簡單:

private static final Logger LOGGER = Logger.getLogger(MethodHandles.lookup().lookupClass());

MethodHandles.lookup()使用調用程序類創建查找時。 (通過Reflection.getCallerClass()但是Reflection是內部API,因此您需要其他方法來處理查找步驟)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM