获取对象实例的原始类

时间:2011-06-05 15:40:11

标签: java class extends

我的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中有一种简单的方法可以做到这一点吗?

谢谢,
罗伯特

3 个答案:

答案 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()。如果从静态块或静态方法创建其中一个,则必须进行试探。