2012-03-26 5 views
5

ショートバージョン: 呼び出しスタック内の前のMethodを見つけるにはJavaの方法を見つける必要があります(メソッドの大文字の 'M'には実際のjava.lang.reflect.Methodオブジェクトが必要です)。Javaでの呼び出し方法の検索

背景: Google GuavaのPreconditions.checkNotNull(...)コンセプトの拡張に取り組んでいます。このコンセプトにより、プログラマはnullのすべてのパラメータを同時にチェックし、呼び出し元のメソッドのパラメータ名に基づいてNPEを構築できます。例:最初の引数がnullだった場合

public class MyClass 
{ 
    public void myMethod(Object arg1, Integer arg2, String arg3) 
    { 
     MyPreconditions.checkAllNotNull(arg1, arg2, arg3); 
    } 
} 

ので、その後、NPEはarg1 cannot be null (MyClass:myMethod(Object, Integer, String)

を読むかもしれない私はすでにClass呼び出して取得すると、私は春を経由してパラメータ名を取得することができますどのように出て働いてきましたLocalVariableTableParameterNameDiscoverer(またはパラナーゼライブラリーを介して)1つはMethodです。私が把握できない部分は、Methodを取得する方法だけです。

スタックトレースを使用してメソッドを取得することはできますが、メソッドがオーバーライドされてもそれは役に立ちません。実際のスタックを取得する方法はありますか(内部のcom.sunクラスでも)?代わりに、私は呼び出しメソッドの行番号を得ることができるので、オブジェクトから取得したMethodの行番号を見つける方法はありますか?

+0

重複するhttp://stackoverflow.com/questions/421280/in-java-how-do-i-find-the-caller-of-a-method-using-stacktrace-or-reflection –

答えて

1

"スタックトレースを使用してメソッド名を取得することはできますが、メソッドがオーバーライドされてもそれは役に立ちません。 - スタックトレースには、メソッドがオーバーライドされていても正しい方法でクラス名(およびソースファイル)が含まれています。

実際のMethodオブジェクトを取得するには、(良い、一貫性のある)方法はありません。特にアクティブなセキュリティマネージャで動作するものはありません。 Javaセキュリティコード自体はそれを行うためにいくつかのトリックを使用しますが、それを複製することはさまざまなVM間では移植できません。

3

Thread.getStackTrace()は、現在のスタックトレースを提供します。そこから、クラス名とメソッド名を取得できます(メソッドがオーバーライドされていても、正確なクラスがそこに表示されます)。

しかし、これは奇妙で、必要ではありません。そしてそれについては、Preconditions呼び出しが失敗した場合に生成されるスタックトレースにすでに存在するメッセージを提供しています。

+0

あなたは、しかし、クラスが別のクラスローダから来た場合、 'Method'オブジェクトは一貫して解決されません。 – Dolda2000

+0

さて、あなたは 'Throwable'からトレースを直接得ることができます:' try {Exception( "deliberate");} catch(Exception e){e.getStackTrace(); } '。しかし、それを必要とするのは幾分奇妙であることに同意しました... – user268396

+0

@ Dolda2000これは 'Class'オブジェクトの' getClassLoader() 'メソッドが対象です。有効な 'ClassLoader'インスタンスを取得するか、ブートローダを意味する' null'を取得します。あなたはそこからそれを取る...? – user268396

関連する問題