假设我有一个自定义的 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指定的任务。该线程有可能被多个可运行对象重用。所以我想在MyThread
的public void run()
方法中检索Method
和Class
信息。由于 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()
时,我仍然可以获得有关可运行对象实例化位置的 Method
和 Class
吗?
最佳答案
要了解与调用方法、类名等相关的事情,应该使用反射。
就您的情况而言,您应该像这样修改代码。
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/