假设我有一个自定义Thread
类,负责运行runnables
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?
}
}
然后在某种方法中,我提交了runnable
public void someMethod() {
new MyThread(new Runnable() {
@Override
public void run() {
System.out.println("Blah");
}
});
}
假设我无法控制someMethod
,我是否可以修改MyThread
,以便每当将runnable提交给MyThread
时,我都可以获得有关someMethod
的信息(例如方法)名称someMethod
,班级名称??
修改
事实上,原始问题是我问题的一部分。
我提供了一个可由线程池(ExecutorService)使用的ThreadFactory
。
public class MyThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable r) {
return new MyThread(r);
}
}
用户可以使用MyThreadFactory
ExecutorService pool = Executors.newCachedThreadPool(new MyThreadFactory());
通过调用pool.execute(runnable),将创建一个MyThread实例来执行runnable指定的任务。线程可能会被多个runnables重用。因此,我想在Method
Class
方法中检索public void run()
和MyThread
信息。由于runnable
存储在基本Thread
类的私有字段中,因此我无法使用 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());
}
在调用Method
时,我是否仍然可以获取Class
和public void run()
关于runnable实例化的位置?
答案 0 :(得分:1)
要了解与调用方法,类名等相关的事项,您应该使用反射。
在您的情况下,您应该像这样修改您的代码。
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().getEnclosingMethod();
,您将收到包含Runnable对象的方法。在你的情况下,oneMethod。
这个想法。告诉我它是否有帮助。