这是一个不寻常的情况:是否可以获取最初产生当前正在运行的线程的类/方法?运行堆栈跟踪自然会在当前线程的调用堆栈顶部停止。
是的,您可以:我提供两种方式:一种标准方式和一种半破解方式。
大多数答案都应该是Java内置的功能。
安装安全管理器并覆盖SecurityManager.getThreadGroup()
,您可以轻松获取堆栈跟踪,或者可以通过覆盖其余方法来禁用其余的安全检查。
顽皮的一:在主线程中安装一个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();
}
}
线程[t1,5,main]-创建堆栈:[bestssss.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)]**
线程[t2,5,main]-创建堆栈:[bestssss.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)]**
祝您好运,黑客入侵愉快。
问题内容: 有没有办法获取Java中当前正在执行的方法的名称? 问题答案: 从技术上讲这将起作用… 但是,将在编译时创建一个新的匿名内部类(例如)。因此,这将为.class每个部署此技巧的方法创建一个文件。另外,在运行时每次调用时都会创建一个其他未使用的对象实例。因此,这可能是可以接受的调试技巧,但确实会带来大量开销。 该技巧的一个优点是返回值可用于检索方法的所有其他信息,包括注释和参数名称。这样
问题内容: 是否有可能做到这一点: 我的堆栈中有Dojo和jQuery框架,因此,如果这两个框架都使它变得更容易,它们将可用。 问题答案: 在ES5及更高版本中,无法访问该信息。 在旧版JS中,您可以使用来获得它。 但是,您可能必须解析名称,因为它可能包括一些额外的垃圾。不过,在某些实现中,您可以使用来简单地获取名称。 解析:
问题内容: 您好在我的Java类Toto中,我有3个静态方法,我想知道当我处于这些方法之一时,如何在try catch bloc中获取和显示package.class.methode的名称?我在methodeA中尝试过: 但它不起作用,我怎么也可以尝试显示它?谢谢 问题答案: -将打印整个异常stracktrace-即所有方法+行号。
在Powershell中,我使用命令Register ScheduledJob-ScriptBlock{…}创建了一个ScheduledJob。此ScheduledJob执行脚本块。如何从ScriptBlock检索当前运行的ScheduledJob的名称? 例如。 Windows任务计划程序中的任务正在运行以下命令: powershell.exe-NoLogo-NonInteractive-Win
问题内容: 我要做的就是获取当前的类名,并且java在类名的末尾附加了一个无用的废话 $ 1 。如何摆脱它,只返回实际的类名? 问题答案: “ $ 1”不是“无用的废话”。如果您的班级是匿名的,则会附加一个数字。 如果您不想要类本身,而是想要其声明类,则可以使用。例如: 您可以使用一些静态实用程序方法来移动它。 但是请注意,这不是当前的类名。匿名类与其封闭类是不同的类。内部类的情况与此类似。
问题内容: 我的网站上的文件夹内有一个php页面。 我需要将当前目录的名称添加到变量中,例如: 这可能吗? 问题答案: 要么 或(PHP5) http://php.net/manual/zh/function.getcwd.php http://php.net/manual/zh/function.dirname.php 您可以用来获取路径的结尾部分:) 就您而言,我想说您最有可能希望使用,当您的