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

Eli*_*jah 2 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...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

cle*_*tus 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...
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 6

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

private Logger logger = LoggerFactory.getLogger(getClass());
Run Code Online (Sandbox Code Playgroud)

这意味着您将使用实际类的类别进行记录.由于这些信息是在日志中了,我不认为它使多大意义,包括它的execute方法.只需确保您的日志输出格式包含类别名称,它应该没问题.