10

我正在以静态上下文方式(如PHP Scope Resolution Operator )寻找对 JAVA 中当前类的“自我”引用?

解决方案:突破范围?请注意,这与一个非常慢的静态定义相比(300 倍):

static Logger LOG = LoggerFactory.getLogger(new RuntimeException().getStackTrace()[0].getClassName());

老式的方法是:

static Logger LOG = LoggerFactory.getLogger(<Classname>.class.getName());

有没有其他选择?我正在寻找一种将记录器定义放入抽象类的方法。记录器应自行确定调用它的类。

4

4 回答 4

14

稍微快一点

static final Logger LOG = LoggerFactory.getLogger(
       Thread.currentThread().getStackTrace()[0].getClassName());

如果你这样做 1000 次,使用 Class.class.getName() 需要 36 毫秒,这样做需要 60 毫秒。也许它不值得担心太多。;)

于 2011-03-11T09:48:23.990 回答
4

你不应该继承记录器。只需在每个类中声明记录器。

但如果你不想做这样有用的思考,就不要让它静态)

于 2011-03-11T09:22:47.950 回答
1

我认为没有任何替代方案与您的问题中的两者有显着不同。

您可以像这样创建一个辅助方法:

public static String getCallingClassname() {
    return new RuntimeException().getStackTrace()[1].getClassName();
}

进而

static Logger LOG = LoggerFactory.getLogger(Helper.getCallingClassname());

但这与原始版本一样昂贵。(FWIW - 慢 300 倍可能不是一个主要问题,除非您有数千个这样的记录器。这些静态中的每一个都只初始化一次......)

我个人偏爱“老式”的做法。

于 2011-03-11T09:46:45.443 回答
0

你不需要使用任何这些。我觉得使用方便的是:
//Logger

private static final Logger logger = LoggerFactory.getLogger(CreateEmployeeRecord.class or this.class);

在需要记录的每个类中执行此操作,并将括号中的类名更改为相应的类,无论它被使用。

于 2019-02-26T00:00:32.073 回答