私は、それがどこから呼び出されたかを知る必要があるaspectj面に取り組んでいます。現時点では、私はこの情報にアクセスするには数百マイクロ秒かかるが、この情報にアクセスするにはすぐに発信者情報にアクセスする
new Throwable().getStackTrace();
を使用しています。
私はSecurityManagerを見てきましたが、それは私にクラス名を得ることができるようです。
私が見逃した他の選択肢はありますか? @ apanginの答えに私のコメントに言及
更新
JMHベンチマーク結果:
Benchmark Mode Cnt Score Error Units
MyBenchmark.javalangaccess13i avgt 100 2025.865 ± 8.133 ns/op
MyBenchmark.javalangaccess2i avgt 100 2648.598 ± 24.369 ns/op
MyBenchmark.throwable1 avgt 100 12706.978 ± 84.651 ns/op
ベンチマークコード:Windowsの10、JDK 1.8の下で実行さ
@Benchmark
public StackTraceElement[] throwable1() {
return new Throwable().getStackTrace();
}
@SuppressWarnings("restriction")
@Benchmark
public static StackTraceElement javalangaccess2i() {
Exception e = new Exception();
return sun.misc.SharedSecrets.getJavaLangAccess().getStackTraceElement(e, 2);
}
@SuppressWarnings("restriction")
@Benchmark
public static StackTraceElement javalangaccess13i() {
Exception e = new Exception();
return sun.misc.SharedSecrets.getJavaLangAccess().getStackTraceElement(e, 13);
}
をテストします。 0_112、Dell XPS13 9343(i5-5200U @ 2.2GHz)
明白な疑問はなぜこれが必要なのかです。スタックトレースを取得するには、さまざまな理由からかなりの時間がかかります。そのため、スタックトレースを読み込むことなく、元の問題の代替ソリューションを見つけることをお勧めします。 – biziclop
発信者情報の取得が遅いです。すべてのロギングフレームワークには、たとえばその問題があります。また、パフォーマンスが必要な場合は、そのような情報をオンにしないようにアドバイスします。 – zapl
他のコメントは次のように述べています。欠けていることは、何とか解決する必要のある矛盾する要件があることです。合理的で堅牢な方法ですべてを満たすことができないので、 – GhostCat