在类的私有静态最终变量中使用动态类名

时间:2019-07-05 06:10:36

标签: java reflection static

请考虑以下示例:

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

在上面的示例中,传递给getLogger方法的参数是硬编码的,即LoggerTestClass.class 现在,每次更改类名时,都必须更改getLogger方法的参数。

可以通过其他任何方式自动获取类名的方法,例如对于非静态变量,我们可以添加this.getClass()

3 个答案:

答案 0 :(得分:1)

您可以使用Lombok以简洁的方式实现它。您需要做的就是将@Log放在类的顶部,它将为您提供一个log对象。 了解更多here

答案 1 :(得分:0)

伯罗,首先,我们需要弄清楚一些概念。

在Java中,如果标识符是类的成员,并且用'static'关键字修饰,则其值在编译阶段确定。

如果添加了'final'关键字,则标识符为常数,它的值必须声明为初始值。并且该值在Java运行时中不能更改。

有趣的是,静态常量仅在类内部声明,可以称为“类名” +“。” ,但与类上下文无关。如果没有上下文,则标识符不会变为动态。

我认为如果让标识符变成动态的,只有两种方法:

  1. 让标识符成为变量。删除“ final”关键字。代码如下:

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

    如果您不希望其他类访问它,那么'private'关键字就足够了。

  2. 尝试使用Java动态代理。可以在Java运行时中更改类。

代码开心〜

欢迎与我交谈〜

答案 2 :(得分:0)

您可以使用Java 9+吗?然后解决方案非常简单:

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

由于MethodHandles.lookup()使用调用方类创建查找。 (通过Reflection.getCallerClass(),但Reflection是内部API,因此您需要其他方法来处理查找步骤)