我正在构建一个java分析工具,该机制要求应用程序的所有Thread实例都被子类替换" ProfilingThread"它覆盖了一些线程的行为,以实现分析功能。
鉴于Java应用程序的源代码,我可以简单地重新计算所有" Thread" class to" ProfilingThread"类。但是,AWT事件调度程序的线程不是由用户代码实例化的,而是在调用AWT函数时自动创建。
如何用ProfilingThread实例替换AWT事件调度程序的Thread实例?
欢迎所有的想法和批评。
答案 0 :(得分:2)
首先有点批评:在生产级应用程序中破解Java内部结构通常不是一个好主意。
更好的解决方案是为事件调度线程的任何实例添加专门的处理,并仅配置您自己的类。很有可能java的其他部分将启动其他线程,这些线程也不会延伸到ProfilingThread ...
但是如果你有来改变AWT事件调度线程:
事件调度线程是系统事件队列中的java.awt.EventDispatchThread
实例,可通过
Toolkit.getDefaultToolkit().getSystemEventQueue()
要替换线程,您必须使用java.awt.EventDispatchThread
重新实现ProfilingThread
,或者更好地扩展EventDispatchThread
并添加分析功能。
然后你必须使用反射来设置字段,因为它是私有的,通常无法从外部进行更改。 (有很多关于如何做到这一点的例子)
作为参考:http://developer.classpath.org/doc/java/awt/EventQueue-source.html