![](/img/trans.png)
[英]Closest Ruby representation of a 'private static final' and 'public static final' class variable in Java?
[英]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()
兄弟,首先,我們需要弄清楚一些概念。
在Java中,如果標識符是類的成員,並且用'static'關鍵字修飾,則其值在編譯階段確定。
如果添加了'final'關鍵字,則標識符為常數,它的值必須聲明為初始值。並且該值在Java運行時中不能更改。
有趣的是,靜態常量僅在類內部聲明,可以稱為“類名” +“”。 ,但與類上下文無關。 如果沒有上下文,則標識符不會變為動態。
我認為,如果讓標識符變成動態的,則只有兩種方法:
讓標識符成為變量。刪除``final''關鍵字。代碼如下所示:
class Test { private static Logger LOGGER; public Test() { LOGGER = Logger.getLogger(getClass().getSimpleName()); } }
如果您不希望其他類訪問它,那么“ private”關鍵字就足夠了。
嘗試使用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.