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