Java 从运行runnable的线程获取创建runnable的方法
假设我有一个定制的Java 从运行runnable的线程获取创建runnable的方法,java,methods,Java,Methods,假设我有一个定制的Thread类,负责运行Runnable 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
Thread
类,负责运行Runnable
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
,以便每当向MyThread
提交runnable时,我都可以获得有关someMethod
的信息(例如,方法名someMethod
,类名)
编辑
事实上,最初的问题是我问题的一部分
我提供了一个线程池(ExecutorService)可以使用的ThreadFactory
用户可以使用MyThreadFactory
ExecutorService pool=Executors.newCachedThreadPool(newmythreadfactory())代码>
通过调用pool.execute(runnable),将创建MyThread的实例来执行runnable指定的任务。线程可能会被多个可运行程序重用。因此,我想在public void run()
MethodMyThread
中检索Method
和Class
信息。由于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());
}
在调用public void run()
的那一刻,我还可以获得Method
和Class
关于runnable实例化在哪里的信息吗?要了解与调用方法、类名等相关的事情,应该使用反射
在您的情况下,您应该像这样修改代码
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();
}
}
方法类将具有方法引用。使用此调用方法m=r.getClass().getEnclosuringMethod()代码>,您将收到包含可运行对象的方法。在你的情况下,一种方法
这就是我的想法。如果有帮助,请告诉我。您希望收到什么样的信息?已编辑,感谢您指出您有完整的代码吗?还有一件事。您是否尝试了方法m=this.getClass().getEnclosuringMethod()代码>?在ThreadFactory的newThread
和MyThread
的构造函数中,方法m=this.getClass().getEnclosuringMethod()代码>工作完美:)对我来说,一个困难是我无法访问someMethod
,因此我无法将代码放入该方法中。我希望从MyThread
获得方法名和类。我不知道这是否可能?我明白。。。因此,您可以使用相同的原理仅从MyThread访问此类方法。我编辑了代码,看看这是不是你要找的。嗯。。很抱歉没有提供我的情况的全貌。事实上,我提供了一个ThreadFactory,可供threadpool(ExecutorService)使用。通过调用threadpool.execute(runnable)
,将创建MyThread
的实例以执行runnable指定的任务。线程可能会被多个可运行程序重用。因此,我想在public void run()
MethodMyThread
中检索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();
}
}