0

我的 Java 应用程序需要序列化/反序列化通过 HTTP 接收的 XML 结构。此 XML 消息可能包含几乎任何级别的 XML 的错误元素。这就是所有类都扩展的原因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中有一种简单的方法可以做到这一点吗?

谢谢,
罗伯特

4

3 回答 3

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().
  • 第三个元素 - 您想要的那个(因此 index 2) - 用于调用ApiError构造函数的方法。通过调用getClassName()该元素,您可以获得包含调用ApiError构造函数的方法的类的名称。

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

于 2011-06-05T15:47:08.003 回答
1

所有类都扩展一个......非常糟糕的主意。无论如何,只是一个提示:看看是否Thread.getStackTrace()对你有用......

于 2011-06-05T15:48:40.787 回答
0

如果您的意思是您想要包含使用该new运算符的代码的类的名称,则在 ApiError 中声明一个字段Object originator,将 Object 类型的参数添加到 ApiError 构造函数,并在创建代码中传递this。然后你可以使用originator.getClass().getName(). 如果您从静态块或静态方法创建其中之一,您将不得不下注。

于 2011-06-05T15:43:25.753 回答