JVM - 在正在运行(非检测)的会话中获取类的实例

时间:2016-10-18 07:45:04

标签: java reflection reference jvm

我需要通过在给定类的实例上调用特定方法来停止进程。这个过程已经运行了一天,如果我把它关闭,我会失去很多工作。由于API中的错误,GUI错误连线并且没有调用正确的停止功能。我附加了一个交互式Java(Scala)解释器,所以如果我能掌握该过程的实例,我可以轻松地调用正确的方法。

我不在调试会话中,没有com.sun.jdi。我可以在堆栈跟踪转储中看到该实例,但StackTraceElement不包含实际实例,只包含类和行号。

在正在运行的会话中,没有特定的工具,有没有办法通过它的类,通过线程转储来获取该实例?

1 个答案:

答案 0 :(得分:2)

可以使用JVMTI IterateOverInstancesOfClass函数获取给定类的所有实例。请参阅this answer中的示例。

创建一个JNI库,使用上面的函数找到所需的实例,并从JNI_OnLoad条目中调用一个方法。然后从解释器控制台调用System.load以加载此库。