나는 그것이 어디서부터 호출되었는지를 알아야하는 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
벤치 마크 코드 : 윈도우 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