首页 > 解决方案 > 如何通过实用程序方法在 java 中检索类的名称?

问题描述

我正在尝试减少应用程序中的代码行。出于记录目的,我有一个我之前在每个类中创建的方法来检索类和方法的名称。

    public String currentClassAndMethod() {
    // getStackTrace()[1] method return implementing method name at 1st index
    return "Inside class: " + getClass().getSimpleName() + " in method name: "
            + new Throwable().getStackTrace()[1].getMethodName();

}

上面的方法在实现类(控制器、服务类等)中时工作正常,但是当我把它放在 Util 类中时,它给了我 Util 类的名称。

    @GetMapping("/products")
    public List<Product> getProducts() {
    logger.info(ecommUtils.currentClassAndMethod());
    List<Product> productList = productService.getProducts();
    return productList;

}

我不能使这种方法成为静态的。我想要实现的是在一个地方定义这个方法,然后从每个类中调用这个方法。

标签: javalogging

解决方案


您在这里遇到了一些严重的问题:

  1. 通话getStackTrace()真的很慢。
  2. 你在错误的地方做这项工作;通常,您希望日志记录系统本身来处理这个问题。您的代码应该只担心需要记录什么字符串以及在什么级别。您的日志框架的工作是如何呈现这些信息(例如,由日志框架添加日志语句的位置和当前时间,例如。
  3. getClass() 总是返回您的currentClassAndMethod()方法所在的类,因此不是您想要的。这会起作用:
int nestingLevel = 1;
StackTraceElement elem = new Throwable().getStackTrace[nestingLevel];
return elem.getFileName() + "::" + elem.getMethodName() + "::" + elem.getLineNumber();
// there is elem.getClassName() too if you prefer that.

所以,这就是你要做的事情..如果你想这样做。我建议你不要。如果必须,请注意,如果您在日志基础设施中移动此“获取我的位置”代码的调用,例如在日志处理程序中(我不知道您使用什么日志框架,所以我必须对此含糊其辞)——这样,如果你在一个你忽略的级别登录,你不需要花费昂贵的时间来获取堆栈跟踪,只是为了生成的字符串能够通过日志基础设施并被完全忽略,因为它低于配置的“此级别的日志”。


推荐阅读