我的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中有一种简单的方法可以做到这一点吗?
谢谢,
罗伯特
答案 0 :(得分:2)
是的,您可以通过获取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
污染您的类层次结构。
答案 1 :(得分:1)
所有课程都扩展了一个... 非常糟糕的主意。无论如何,只是一个提示:看看Thread.getStackTrace()
是否对你有用......
答案 2 :(得分:0)
如果您想要包含使用new
运算符的代码的类的名称,则在ApiError Object originator
中声明一个字段,将类型为Object的参数添加到ApiError构造函数中,并在创建代码中传递this
。然后你可以使用originator.getClass().getName()
。如果从静态块或静态方法创建其中一个,则必须进行试探。