【问题标题】:Get the name of a calling class without the use of Exceptions在不使用异常的情况下获取调用类的名称
【发布时间】:2011-07-19 13:09:58
【问题描述】:

是的,通过使用异常来获取类名是一个合理的解决方案,但我正在寻找更优雅的东西。

String className = new Exception().getStackTrace()[1].getClassName();

这将主要用于记录目的并确保我的缓存关键字是特定于组件/调用者类的。

【问题讨论】:

标签: java


【解决方案1】:

a) 不需要使用Exception,你可以这样做:Thread.currentThread().getStackTrace()

b) 无论你想做什么,都不要那样做。听起来真可怕。我想您应该考虑通过 AOP 进行日志记录(这里是 a small tutorial,看起来很合理)。

【讨论】:

  • 获得调用类是有充分理由的。一种常见的方法是在调用者的类而不是方法的类上调用 Class.getResourceAsStream()(“获取我的类的资源”)
  • @Wheezil 当然,但这听起来很老套,就像大多数情况一样。我并不是说我从不走老套路,但我更喜欢“干净”的方式。
  • 另请注意,调用 class.method 是堆栈跟踪中的元素 [2]。 element[1]是当前的class.method,element[0]是Thread.getStackTrace
  • 同意这是 hacky。如果我想将 load-from-resource-name 集中到一个实用程序方法中,我只做过测试。
  • 是的,我也犯了这个错误,就像我在测试中经常使用反射一样
【解决方案2】:
Thread.currentThread().getStackTrace()

【讨论】:

【解决方案3】:

在 Oracle JVM 上,您可以使用非标准 sun.reflect.Reflection.getCallerClass(2) 。这要快得多,但只能小心使用。 (因为它不是跨平台的,并且可以在 Java 版本之间更改)

【讨论】:

  • 它确实在 Java7u10 和 u11 之间发生了变化。除此之外,Java8 中将是removed。真可惜,这是迄今为止最快的方法(比 Thread.currentThread().getStackTrace() 快 100 倍),我看不出有替代品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多