我正在寻找一个静态上下文方式的JAVA当前类的“自我”引用,就像在PHP Scope Resolution Operator中一样?
解决方案:超出范围?请注意,这与静态定义相比真的很慢(乘以300):
static Logger LOG = LoggerFactory.getLogger(new RuntimeException().getStackTrace()[0].getClassName());
老式的方式是:
static Logger LOG = LoggerFactory.getLogger(<Classname>.class.getName());
还有其他选择吗?我正在寻找一种将记录器定义放在抽象类中的方法。记录器应该确定它自己调用的类。
稍快一点
static final Logger LOG = LoggerFactory.getLogger(
Thread.currentThread().getStackTrace()[0].getClassName());
如果你这样做了1000次,那么使用Class.class.getName()需要36 ms,而这样做需要60 ms。也许它不值得担心太多。 ;)
你不应该继承记录器。只需在每个类中声明记录器。
但如果你不想做这样有用的思考,就不要让它静止)
我不认为在你的问题中有任何与这两者有显着差异的替代方案。
您可以创建一个这样的帮助方法:
public static String getCallingClassname() {
return new RuntimeException().getStackTrace()[1].getClassName();
}
然后
static Logger LOG = LoggerFactory.getLogger(Helper.getCallingClassname());
但这和原始版本一样昂贵。 (FWIW - 慢300倍可能不是主要问题,除非你有成千上万的这些记录器。这些静力学中的每一个都只被初始化一次......)
我个人的偏好是采用“老式”的方式。
您不需要使用任何这些。我觉得使用方便的是: //记录仪
private static final Logger logger = LoggerFactory.getLogger(CreateEmployeeRecord.class或this.class);
在需要记录的每个类中执行此操作,并将括号中的类名更改为相应的类,无论它在何处使用。