代码之家  ›  专栏  ›  技术社区  ›  Elijah

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

  •  2
  • Elijah  · 技术社区  · 17 年前

    理性的

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

    问题

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

    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 回复  |  直到 17 年前
        1
  •  8
  •   cletus    17 年前

    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...
    }
    
        2
  •  6
  •   Jon Skeet    17 年前

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

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

    这意味着您将使用 实际的 班级。由于这些信息已经在日志中了,我认为这样做没有什么意义 包括在 execute 方法。只要确保日志输出格式包含类别名称,就可以了。

        3
  •  4
  •   Bhushan Bhangale    17 年前

    为什么要显式记录类名?log4j已经这样做了。您定义日志程序的方式将实现这一技巧。检查日志文件。