当前位置: 首页 > 面试题库 >

我可以获取产生当前线程的类和方法的名称吗?

井通
2023-03-14
问题内容

这是一个不寻常的情况:是否可以获取最初产生当前正在运行的线程的类/方法?运行堆栈跟踪自然会在当前线程的调用堆栈顶部停止。


问题答案:

是的,您可以:我提供两种方式:一种标准方式和一种半破解方式。

大多数答案都应该是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 您可以用来获取路径的结尾部分:) 就您而言,我想说您最有可能希望使用,当您的