Some sun.misc internal APIs are deprectaed in JDK 9 and will be encapsulated or removed in a future release.
private static String getCallerSignatureSharedSecrets() { String executedBy = null; Exception exception = new Exception(); final JavaLangAccess javaLangAccess = (JavaLangAccess) javaLangAccessObject; for (int i = 2; i < javaLangAccess.getStackTraceDepth(exception); i++) { final StackTraceElement stackTraceElement = javaLangAccess.getStackTraceElement(exception, i); if (StagemonitorClassNameMatcher.isIncluded(stackTraceElement.getClassName())) { executedBy = SignatureUtils.getSignature(stackTraceElement.getClassName(), stackTraceElement.getMethodName()); break; } } return executedBy; }
private static void blockedOn(Interruptible interruptible) { sun.misc.SharedSecrets.getJavaLangAccess().blockedOn(Thread.currentThread(), interruptible); }
public static StackTraceElement getCaller() { Exception e = new Exception(); return sun.misc.SharedSecrets.getJavaLangAccess().getStackTraceElement(e, 2); }
private synchronized Map<Class<? extends Annotation>, Annotation> declaredAnnotations() { if (declaredAnnotations == null) { declaredAnnotations = AnnotationParser.parseAnnotations( annotations, sun.misc.SharedSecrets.getJavaLangAccess(). getConstantPool(getDeclaringClass()), getDeclaringClass()); } return declaredAnnotations; }
sun.misc.SharedSecrets.getJavaLangAccess().getEnumConstantsShared(MyEnumType.class)
@State(Scope.Benchmark) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) public class StackTraces { @Benchmark public StackTraceElement[] getStackTrace() { return new Exception().getStackTrace(); } @Benchmark public StackTraceElement getFast() { return sun.misc.SharedSecrets.getJavaLangAccess() .getStackTraceElement(new Exception(), 2); } }
@Override public String get() { int stackTraceDepth = javaLangAccess.getStackTraceDepth(this); StackTraceElement previousElement = null; // Skip get() for (int i = 2; i < stackTraceDepth; i++) { StackTraceElement e = javaLangAccess.getStackTraceElement(this, i); String className = e.getClassName(); if (isUserCode(className)) { StringBuilder sb = new StringBuilder(); if (previousElement != null) { sb.append("\t").append(previousElement.toString()).append("\n"); } sb.append("\t").append(e.toString()).append("\n"); return sb.toString(); } else { if (!full && e.getLineNumber() <= 1) { continue; } String classAndMethod = className + "." + e.getMethodName(); if (!full && shouldSanitize(classAndMethod)) { continue; } previousElement = e; } } return ""; } }
sun.misc.SharedSecrets.getJavaLangAccess().getStackTraceElement()
private static void blockedOn(Interruptible interruptible) { sun.misc.SharedSecrets.getJavaLangAccess().blockedOn(Thread.currentThread(), interruptible); }
int depth = access.getStackTraceDepth(throwable); StackTraceElement frame = access.getStackTraceElement(throwable, ix); String cname = frame.getClassName(); if (lookingForClassName) {
package de.scrum_master.aspect; import de.scrum_master.app.Application; import sun.misc.SharedSecrets; public aspect MyAspect { before() : call(* Application.doSomething()) { Object o = thisEnclosingJoinPointStaticPart.getSignature(); //System.out.println(o); } before() : call(* Application.doSomething2()) { Object o = new Throwable().getStackTrace()[1]; //System.out.println(o); } before() : call(* Application.doSomething3()) { Object o = SharedSecrets.getJavaLangAccess().getStackTraceElement(new Throwable(), 1); //System.out.println(o); } }
private static void blockedOn(Interruptible interruptible) { sun.misc.SharedSecrets.getJavaLangAccess().blockedOn(Thread.currentThread(), interruptible); }
@Override public String get() { int stackTraceDepth = javaLangAccess.getStackTraceDepth(this); StackTraceElement previousElement = null; // Skip get() for (int i = 2; i < stackTraceDepth; i++) { StackTraceElement e = javaLangAccess.getStackTraceElement(this, i); String className = e.getClassName(); if (isUserCode(className)) { StringBuilder sb = new StringBuilder(); if (previousElement != null) { sb.append("\t").append(previousElement.toString()).append("\n"); } sb.append("\t").append(e.toString()).append("\n"); return sb.toString(); } else { if (!full && e.getLineNumber() <= 1) { continue; } String classAndMethod = className + "." + e.getMethodName(); if (!full && shouldSanitize(classAndMethod)) { continue; } previousElement = e; } } return ""; } }
StackTraceElement e = JLA.getStackTraceElement(throwable, 4); // see note below regarding fixed call depth fragility e = JLA.getStackTraceElement(throwable, 5);
private static String guessPackage() { JavaLangAccess access = SharedSecrets.getJavaLangAccess(); Throwable throwable = new Throwable(); int depth = access.getStackTraceDepth(throwable); boolean lookingForLogger = true; for (int ix = 0; ix < depth; ix++) { // Calling getStackTraceElement directly prevents the VM // from paying the cost of building the entire stack frame. StackTraceElement frame = access.getStackTraceElement(throwable, ix); String cname = frame.getClassName(); boolean isLoggerImpl = isLoggerImplFrame(cname); if (lookingForLogger) { // Skip all frames until we have found the first logger frame. if (isLoggerImpl) { lookingForLogger = false; } } else { if (!isLoggerImpl) { // skip reflection call if (!cname.startsWith("java.lang.reflect.") && !cname.startsWith("sun.reflect.")) { // We've found the relevant frame. return cname; } } } } // We haven't found a suitable frame, so just punt. This is // OK as we are only committed to making a "best effort" here. return PARENT; }
int depth = access.getStackTraceDepth(throwable); access.getStackTraceElement(throwable, ix); String cname = frame.getClassName(); boolean isLoggerImpl = isLoggerImplFrame(cname);
JavaLangAccess access = SharedSecrets.getJavaLangAccess(); Throwable throwable = new Throwable(); int depth = access.getStackTraceDepth(throwable); StackTraceElement frame = access.getStackTraceElement(throwable, i); String cname = frame.getClassName(); boolean isLoggerImpl = isLoggerImplFrame(cname);