gpt4 book ai didi

java - 获取对象实例的原始类

转载 作者:行者123 更新时间:2023-12-02 00:41:28 25 4
gpt4 key购买 nike

我的 Java 应用程序需要序列化/反序列化通过 HTTP 接收的 XML 结构。此 XML 消息几乎可以在 XML 的任何级别上包含 Error 元素。这就是所有类都扩展 ApiError 的原因。另请参阅以下问题:Deserialize repeating XML elements in Simple 2.5.3 (Java)

我创建了以下类:

public class ApiError {
private String code;
private String level;
private String text;

public get/set...() {}

}

我的应用程序中几乎所有其他类都扩展了 ApiError 类,因为这些类可能会引发错误。

我想要一个像 getErrorOrigin() 这样的方法,它返回首先创建 ApiError 实例的类的名称?

Java 有没有简单的方法来做到这一点?

谢谢,
罗伯特

最佳答案

是的,您可以通过在 ApiError 构造函数中获取当前线程的堆栈跟踪来做到这一点:

public ApiError() {
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
this.errorOrigin = trace[2].getClassName();
}

你可以通过输入来了解为什么这是有效的

Thread.dumpStack();

ApiError 构造函数中。如果您创建 ApiError 的新实例,您将看到如下所示的堆栈跟踪:

java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1249)
at ApiError.<init>(Test.java:39)
at Test.main(Test.java:9)

Thread.currentThread().getStackTrace() 将为您提供一个 StackTraceElement 对象数组:

  • 该数组的第一个元素将用于 getStackTrace() 方法本身,该方法在生成跟踪时执行。
  • 第二个元素是 ApiError 构造函数,它调用 getStackTrace()
  • 第三个元素 - 您想要的元素(因此索引 2) - 用于调用 ApiError 构造函数的方法。通过对该元素调用 getClassName(),您可以获取包含调用 ApiError 构造函数的方法的类的名称。

话虽如此,您似乎正在尝试重新实现异常。我会认真考虑从你的方法中抛出异常,而不是返回 ApiError 对象。这使得错误处理与“业务逻辑”分开。此外,错误(希望)是一种特殊情况,因此使用异常进行错误处理是有意义的,而不是让 ApiError 污染您的类层次结构。

关于java - 获取对象实例的原始类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6243918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com