0

私の Java アプリケーションは、HTTP 経由で受信した XML 構造をシリアライズ/デシリアライズする必要があります。この XML メッセージには、XML のほぼすべてのレベルで Error 要素が含まれる場合があります。そのため、すべてのクラスが extends ApiError. 次の質問も参照してください: Simple 2.5.3 (Java) で繰り返し XML 要素をデシリアライズする

次のクラスを作成しました。

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()、トレースが生成されたときに実行されているメソッド自体用です。
  • 2番目の要素はApiError、を呼び出すコンストラクターになりますgetStackTrace()
  • 3番目の要素(必要な要素(したがってインデックス))は、コンストラクター2を呼び出したメソッド用です。ApiErrorその要素を呼び出すことにより、コンストラクターgetClassName()を呼び出したメソッドを含むクラスの名前を取得します。ApiError

そうは言っても、例外を再実装しようとしているようです。オブジェクトを返すのではなく、メソッドから例外をスローすることを真剣に検討しApiErrorます。これにより、エラー処理が「ビジネスロジック」とは別になります。ApiErrorまた、エラーは(うまくいけば)例外的な状況であるため、クラス階層を汚染するのではなく、エラー処理に例外を使用する方が理にかなっています。

于 2011-06-05T15:47:08.003 に答える
1

すべてのクラスが1つを拡張します...非常に悪い考えです。とにかく、ヒント:Thread.getStackTrace()が役に立つかどうかを確認してください...

于 2011-06-05T15:48:40.787 に答える
0

演算子を使用したコードを含むクラスの名前が必要な場合はnew、ApiErrorでフィールドを宣言し、Object originatorObject型の引数をApiErrorコンストラクターに追加して、コードパスを作成しますthis。次に、を使用できますoriginator.getClass().getName()。静的ブロックまたは静的メソッドからこれらのいずれかを作成する場合は、パントする必要があります。

于 2011-06-05T15:43:25.753 に答える