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