我的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/

10-10 11:42