2016-09-29 18 views
9

私はAPIを提供し、APIのメソッドが呼び出された場所を知る必要があります。私はリフレクションやスレッドスタックトレースを使用することができますが、それには多くのランタイムコストが含まれます。メソッドの呼び出し方法を決定する方法

正確なクラス名は必要ありません。呼び出しごとに固有の参照で十分です。私は通常、プリプロセッサを使用して、__FILE____LINE__をメソッド呼び出しに自動的に追加します。

ランタイムコストの低い一意の呼び出し元IDを取得するためのJava(コード生成以外)のメソッドはありますか?

+2

可能な複製http://stackoverflow.com/questions/26425049/how-to-get-a-unique-method-identifier –

+2

ここで解決しようとしている問題は何ですか? – GhostCat

+2

AspectJを見て、あなたのAPIが呼ばれるたびにジョインポイントを設定することができますか? –

答えて

3

一つの解決策は、渡されたキャッシュされたThrowableを持っているだろう

class StackPoint { 
    Throwable stack; 
    public Throwable getStack() { 
     if (stack == null) 
      stack = new Throwable(); 
     return stack; 
    } 
} 

public void methodToCall(StackPoint sp) { 
    Throwable t = sp.getStack(); 

} 


static final StackPoint one = new StackPoint(); 

methodToCall(one); // Have to remember to give each line a different StackPoint. 

注:この呼び出し側の変更を呼び出す方法ならば、あなたは今まで最初の1を記録します。


標準パターンはありません。これを効率的にするには、発信者が一意のIDを渡す必要があります。あなたができる最も近いのはラムダです。

public void methodToCall(Runnable run) { 
    Class id = run.getClass(); 

} 

は、あなたはそれが同じ行に複数回表示された場合でも、それが呼ばれる場所ごとに異なるクラスを作成します。この

methodtoCall(()->{}); 

このようにそれを呼び出すことができます。それは毎回同じオブジェクトを再利用するため、ゴミを生成しません。あなたは

void methodToCall(IntFunction fun) { 

} 

でこれを短くするとasynchroneousが関与しているものとして

methodToCall(a->1); 
+0

同じ引数を2回通して通話するサイトを禁止することはできませんが、これは本当に素晴らしい解決策です。渡された引数が不明な場合は、stacktraceを使用して正確な呼び出しサイトを取得し、キャッシュされた情報を使用します。 – ooxi

+1

しかし、ラムダのアイデンティティを数えるのは間違っていますか? –

+1

@ooxiは、手動で変更することなくコピーして貼り付けることができるコーラーコードを提供しているため、混乱する可能性は低いです。 –

1

を呼び出し、呼び出しを分割し、APIがIDを返してみましょうことができます。

Ticket callTicket = api.call(params); 
Logger.getLogger(getClass().getName(), Level.FINE, callTicket); 
Result result = callTicket.get(); 

上記の結果が返される(シンクロナイズする)ことは、おそらくあなたのコードでは当てはまりません。あなたのコードは結果を他の場所で調べられます。しかし、これもチケットシステムになる可能性があります。

+0

しかし、スタックトレースを調べずに新しいチケットを返す必要があるかどうかを判断するにはどうすればよいですか? – ooxi

+1

同じクラスとラインのすべての呼び出しでも、APIから新しいチケットが描画されます。たとえば、ログに記録する。 asynchrone例外では、チケットは既知であり、ログを検索することができます。確かに別のアプローチと視点。 –

+0

技術的な詳細でクライアントのコードをカッターしないので、私は確かにあなたのソリューションを好む。それでも問題をより直接的に解決するので、私は@PeterLawreyからの回答を受け入れています。 – ooxi

関連する問題