如何从Java中的超类的上下文中检索最低子类的名称?

时间:2009-04-16 06:43:02

标签: java debugging stack-trace

理性

我想在几个超类上有更详细的日志调试/日志输出,因此子类名实际上不会影响实时性能,也不会影响应用程序逻辑。我也认为通常这样做是相当糟糕的设计,但是我确实希望在开发过程中记录这些信息。

问题

假设我有一个简单的类结构,如何将子类的名称拉入超类而不必显式传递引用?

public abstract AbstractClass {
    private Logger logger = LoggerFactory.getLogger(getClass());

    public AbstractClass() {}

    public void execute(ContextObject context) {
        if (logger.debuggingEnabled()) {
            String invokingClassName = ""; // <-- how do I get this?
            logger.debug("Executing {}", invokingClassName);
        }
        // shared application logic is here...
    }
}

public MyClass extends AbstractClass {
    public MyClass() {}

    @Override
    public void execute(ContextObject context) {
        super.execute(context);
        // application logic...
    }
}

之前我曾经解析过堆栈跟踪,我怀疑如果我想要这些信息,那就是我必须走的路线。有没有人知道一个库会为我做这个或一个好的代码片段?

3 个答案:

答案 0 :(得分:8)

this.getClass().getName()不是这样做的吗?即:

public void execute(ContextObject context) {
    if (logger.debuggingEnabled()) {
        String invokingClassName = ""; // <-- how do I get this?
        logger.debug("Executing {}", this.getClass().getName());
    }
    // shared application logic is here...
}

答案 1 :(得分:6)

执行此行时,您已经获得了该信息:

private Logger logger = LoggerFactory.getLogger(getClass());

这意味着您将使用实际类的类别进行记录。由于该信息已经在日志中,我认为将其包含在execute方法中并不合理。只需确保您的日志输出格式包含类别名称,它应该没问题。

答案 2 :(得分:4)

为什么要显式记录类名。 Log4j已经这样做了。您定义Logger的方式可以解决问题。检查您的日志文件。