0

例外をスローするリフレクションを介してメソッドを呼び出しています。

ただし、スタックトレースを取得すると

StackTraceElement[] elements = Thread.currentThread().getStackTrace();

リフレクトされたメソッドまでのスタック トレース全体を取得できません。リフレクションを実装するメソッドまでのみスタック トレースを取得します。

反映されたクラスは、まったく別のプロジェクトにあります。

編集: コード スニペットの追加

プロジェクトA

Class ReflectionImpl {

   public void callMethodsviaReflection{
     try{
              // Reflection code to call the method

         }catch(InvocationTargetException iTE){

           StringBuilder errorLogBuilder = new StringBuilder();
            errorLogBuilder.append(ex.toString());
            errorLogBuilder.append("\n");

            StackTraceElement[] elements = Thread.currentThread().getStackTrace();

             for (int i=0;i<elements.length;i++) {

                 errorLogBuilder.append((elements[i].toString()));
                 errorLogBuilder.append("\n");
             }

            System.out.println(errorLogBuilder.toString());
        }
    }
}

プロジェクト B --> Eclipse でプロジェクト A を参照

Class ReflectedClass{

 List<String> nameList = null;

 public void reflectedMethod(){

     nameList.add("Hello");
    }      
}
4

1 に答える 1

8

あなたが呼んでいる特定のポイントで:

StackTraceElement[] elements = Thread.currentThread().getStackTrace();

「反射呼び出し」はすでに完了しています。これは、呼び出しから返される呼び出しスタックに反映されます。あなたが望むように聞こえます:

iTE.getCause().getStackTrace();

これにより、実際に例外をスローしたメソッドまでの呼び出しスタックが得られます。

于 2013-01-30T06:58:56.673 に答える