3

私は現在、Liferay のプロジェクトに取り組んでいます。このプロジェクトでは、履歴でメソッドとこれらのメソッドに与えられたパラメーターにアクセスできるようにしたいと考えています。これは、特定のコード ブロックでスローされる例外がある場合に行われます。

私はすでに検索しており、メソッド名の履歴 (Thread.currentThread().getStackTrace();) を取得するのは簡単ですが、これらのメソッドに与えられたパラメーターも知りたいです。

例えば:

public class A {
    public static void main(String[] Args) {
        try {
            System.out.println(new B().someMethod(5));
        } catch (Exception e) {
            //GET HISTORY
        }
    }
}

public class B {
    public int someMethod(int i) throws Exception {
        i += 2;
        throw new Exception("Expected Exception to Generate History Search");
        return i;
    }
}

クラスAで、例外をキャッチしたときに、そのすべてのデータをどのように学習できるでしょうか? そして、どうすればそれを行うことができますか?

4

3 に答える 3

1

アスペクト指向プログラミングを使用できます。たとえば、 AspectJを見てください。

次の側面は、プログラムの実行中にすべてのパブリック メソッド呼び出しをトレースします。これは、独自の要件に合わせて微調整できます。たとえば、ポイントカットは、独自のパッケージのみを取得するように調整できます。print ステートメントは、何らかのロギング フレームワークを使用するように変更できます。

public aspect Trace {
    pointcut publicMethodExecuted(): execution(public * *(..));

    after(): publicMethodExecuted() {
        System.out.printf("Enters on method: %s. \n", thisJoinPoint.getSignature());

        Object[] arguments = thisJoinPoint.getArgs();
        for (int i =0; i < arguments.length; i++){
            Object argument = arguments[i];
            if (argument != null){
                System.out.printf("With argument of type %s and value %s. \n", argument.getClass().toString(), argument);
            }
        }
        System.out.printf("Exits method: %s. \n", thisJoinPoint.getSignature());
    }
}
于 2012-09-21T10:28:08.747 に答える
0

アプリケーションへのログインを確認する必要があります。コードが乱雑になりすぎないようにしたい場合 (私は個人的にlog.debug(...)、各メソッドの最初と最後にある一定のステートメントが嫌いです)、アスペクト指向プログラミングの使用を検討してください (Google でググって、優れたガイドのホスト全体を探すか、まともな aop ガイドを参照してください)。ここでSpring を使用し、下にスクロールしてLoggingAspect) を表示すると、ログに記録するメソッドまたはクラス全体に簡単に注釈を付けることができます。

于 2012-09-21T10:27:14.100 に答える
0

アプリケーションでのロギングの使用を検討する必要があります。

于 2012-09-21T10:23:36.067 に答える