请考虑以下示例:
public class LoggerTestClass {
private static final Logger LOGGER = Logger.getLogger(LoggerTestClass.class);
}
在上面的示例中,传递给getLogger
方法的参数是硬编码的,即LoggerTestClass.class
现在,每次更改类名时,都必须更改getLogger
方法的参数。
可以通过其他任何方式自动获取类名的方法,例如对于非静态变量,我们可以添加this.getClass()
答案 0 :(得分:1)
答案 1 :(得分:0)
伯罗,首先,我们需要弄清楚一些概念。
在Java中,如果标识符是类的成员,并且用'static'关键字修饰,则其值在编译阶段确定。
如果添加了'final'关键字,则标识符为常数,它的值必须声明为初始值。并且该值在Java运行时中不能更改。
有趣的是,静态常量仅在类内部声明,可以称为“类名” +“。” ,但与类上下文无关。如果没有上下文,则标识符不会变为动态。
我认为如果让标识符变成动态的,只有两种方法:
让标识符成为变量。删除“ final”关键字。代码如下:
class Test {
private static Logger LOGGER;
public Test() {
LOGGER = Logger.getLogger(getClass().getSimpleName());
}
}
如果您不希望其他类访问它,那么'private'关键字就足够了。
尝试使用Java动态代理。可以在Java运行时中更改类。
代码开心〜
欢迎与我交谈〜
答案 2 :(得分:0)
您可以使用Java 9+吗?然后解决方案非常简单:
private static final Logger LOGGER = Logger.getLogger(MethodHandles.lookup().lookupClass());
由于MethodHandles.lookup()
使用调用方类创建查找。 (通过Reflection.getCallerClass()
,但Reflection
是内部API,因此您需要其他方法来处理查找步骤)