java - 如何通过实用程序方法在 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;
}
我不能使这种方法成为静态的。我想要实现的是在一个地方定义这个方法,然后从每个类中调用这个方法。
解决方案
您在这里遇到了一些严重的问题:
- 通话
getStackTrace()
真的很慢。 - 你在错误的地方做这项工作;通常,您希望日志记录系统本身来处理这个问题。您的代码应该只担心需要记录什么字符串以及在什么级别。您的日志框架的工作是如何呈现这些信息(例如,由日志框架添加日志语句的位置和当前时间,例如。
- 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.
所以,这就是你要做的事情..如果你想这样做。我建议你不要。如果必须,请注意,如果您在日志基础设施中移动此“获取我的位置”代码的调用,例如在日志处理程序中(我不知道您使用什么日志框架,所以我必须对此含糊其辞)——这样,如果你在一个你忽略的级别登录,你不需要花费昂贵的时间来获取堆栈跟踪,只是为了生成的字符串能够通过日志基础设施并被完全忽略,因为它低于配置的“此级别的日志”。
推荐阅读
- swift - iOS:将 SwiftUI 添加到项目 - 未正确加载场景
- python-3.x - 为什么在这个实现中 Apriori 比 FP-Growth 运行得更快?
- ios - 如何在 iOS 13 上更改状态栏背景颜色和文本颜色?
- google-cloud-functions - 使用 Google Cloud Functions 保存一条记录,然后将其覆盖
- swift - 如何强制 Swift 的 JSON 加载器从字符串中解析十进制
- c - 字段的类型不完整 - 联合和结构
- php - chartJS 或/和 php print_r 不能一起工作
- amazon-redshift - 可以使用 redshift 存储的过程来进行日期范围 UNION ALL 查询吗
- android - 如何修复改造错误java.lang.IllegalStateException android
- python - 在 Ubuntu 中安装 OwlReady2 (Python lib) 时出现问题