是的,您可以:
我为您提供 2 种方法:一种标准方法和一种半破解方法。
大多数答案都太过分了,而它应该是 Java 中的内置函数。
安装安全管理器并覆盖SecurityManager.getThreadGroup(),您可以轻松获取堆栈跟踪,也可以通过覆盖其余方法来禁用其余安全检查。
Hacky one:在主线程中安装一个 InheritableThreadLocal(名为 main 并通过方法 main(String[] args) 运行的线程)。覆盖受保护的InheritableThreadLocal.childValue(T parentValue) 就完成了。
注意:您将获得正在创建的线程和父线程(参考)的堆栈跟踪,但这应该足以跟踪问题。
我决定写一个超级简单的示例来说明它是多么容易:
在这里你可以看到结果。查看示例,我想这是我在此站点上发布的最优雅的解决方案,主要是 b/c,它不明显但简单而智能。
package bestsss.util;
import java.util.Arrays;
public class StackInterceptor extends InheritableThreadLocal<StackTraceElement[]>{
public static final StackInterceptor instance;
static{
instance = new StackInterceptor();
instance.set(new Throwable().getStackTrace());
}
@Override
protected StackTraceElement[] childValue(StackTraceElement[] parentValue) {
return new Throwable().getStackTrace();
}
//test//
public static void main(String[] args) {
Runnable r= new Runnable(){
@Override
public void run() {
System.out.printf("%s - creation stack: %s%n", Thread.currentThread(), Arrays.toString(instance.get()).replace(',', '\n'));
}
};
Thread t1 = new Thread(r, "t1");
//spacer
Thread t2 = new Thread(r, "t2");
t1.start();
t2.start();
}
}
Thread[t1,5,main] - 创建堆栈:[bestsss.util.StackInterceptor.childValue(StackInterceptor.java:13)
bestsss.util.StackInterceptor.childValue(StackInterceptor.java:1)
java.lang.ThreadLocal$ThreadLocalMap.(ThreadLocal.java:334)
java.lang.ThreadLocal$ThreadLocalMap.(ThreadLocal.java:242)
java.lang.ThreadLocal.createInheritedMap(ThreadLocal.java:217)
java.lang.Thread.init(Thread.java:362)
java.lang.Thread.(Thread.java:488)
bestsss.util.StackInterceptor.main(StackInterceptor.java:25)]
Thread[t2,5,main] - 创建堆栈:[bestsss.util.StackInterceptor.childValue(StackInterceptor.java:13)
bestsss.util.StackInterceptor.childValue(StackInterceptor.java:1)
java.lang.ThreadLocal$ThreadLocalMap.(ThreadLocal.java:334)
java.lang.ThreadLocal$ThreadLocalMap.(ThreadLocal.java:242)
java.lang.ThreadLocal.createInheritedMap(ThreadLocal.java:217)
java.lang.Thread.init(Thread.java:362)
java.lang.Thread.(Thread.java:488)
bestsss.util.StackInterceptor.main(StackInterceptor.java:27)]
祝你好运,黑客愉快。