java - 获取从运行可运行对象的线程创建可运行对象的方法

标签 java methods

假设我有一个自定义的 Thread 类,负责运行可运行对象

public class MyThread extends Thread{
    public MyThread(Runnable r) {
        super(r);
    }

    @Override
    public void run() {
        super.run(); // Can I put something here to get info about where the runnable is submitted from?
    }
}

然后在某种方法中,我提交可运行的

public void someMethod() {
    new MyThread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Blah");
        }
    });
}

假设我无法控制 someMethod,我可以修改 MyThread 以便每当将可运行对象提交到 MyThread 时,我都可以获取有关 someMethod 的信息(例如方法名称 someMethod、类名称)?

编辑

事实上,原来的问题是我的问题的一部分。

我提供了一个可供线程池(ExecutorService)使用的ThreadFactory

public class MyThreadFactory implements ThreadFactory {
    @Override
    public Thread newThread(Runnable r) {
        return new MyThread(r);
    }
}

用户可以使用MyThreadFactory创建线程池

ExecutorService池 = Executors.newCachedThreadPool(new MyThreadFactory());

通过调用pool.execute(runnable),将创建一个MyThread实例来执行runnable指定的任务。该线程有可能被多个可运行对象重用。所以我想在MyThreadpublic void run()方法中检索MethodClass信息。由于 runnable 存储在基 Thread 类的私有(private)字段中,因此我无法使用 Laerte 提供的解决方案的修改版本,例如:

@Override
public void run() {
    super.run(); 
    // Not working, Since MyThread cannot access private field target of Thread class
    Method m = target.getClass().getEnclosingMethod();
    System.out.println(m.toString());
}

在调用 public void run() 时,我仍然可以获得有关可运行对象实例化位置的 MethodClass 吗?

最佳答案

要了解与调用方法、类名等相关的事情,应该使用反射

就您的情况而言,您应该像这样修改代码。

class MyThread extends Thread{
    public MyThread(Runnable r) {
        super(r);
        Method m = r.getClass().getEnclosingMethod();
        System.out.println(m.toString());
    }

    @Override
    public void run() {
        super.run(); 
    }
}

Method 类将具有方法引用。使用此调用 Method m = r.getClass().getEnlookingMethod();,您将收到包含 Runnable 对象的方法。在你的情况下,一个方法。

就是这个想法。告诉我是否有帮助。

关于java - 获取从运行可运行对象的线程创建可运行对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28868736/

相关文章:

php - 是否存在将 Unicode 文本大写的可靠方法?

javascript:为什么返回值可能为假

javascript - 将原型(prototype)/方法添加到 jQuery val();

JAVA - 如何将形状数组保存到桌面上的文件?

c# - 在 C# 中是否可能只需要将两个参数之一传递给方法?

java - 为什么我无法将内容设置到返回的对象 (Java)?

java - 检查 jsonArray 是否为 null

java - 如何在 Lucene 7 中增加查询?

generics - 我可以在没有未经检查的异常的情况下使用 Collections.EMPTYLIST 吗?

Java新套接字连接与保持 Activity