使用Java检测运行Eclipse RCP应用程序

时间:2014-09-11 11:53:37

标签: eclipse swt classloader rcp instrumentation

使用Java检测,我们可以从JVM访问由Java类加载器加载的类,并通过插入我们的自定义代码来修改其字节码,所有这些都在运行时完成。我们不必担心安全性,它们受适用于Java类和相应类加载器的相同安全上下文的控制。

我们可以使用它来访问一些java应用程序,因为它们在同一个类加载器中运行。

现在我们要做的是使用java检测访问eclipse RCP应用程序,但在RCP中,每个bundle都有自己的类加载器,我们的检测代码使用java应用程序类加载器运行。 当我们访问它时,它正在抛出“Workbench尚未创建”异常,而工作台已经启动并运行。(我希望这是因为它们都有不同的类加载器)。

我曾尝试从here做事,但没有成功。 有没有什么办法可以用java检测工作RCP应用程序。

1 个答案:

答案 0 :(得分:0)

修改类时,插入代码的引用由修改后的类的ClassLoader解析。如果该类加载器没有委托给应用程序加载器,例如因为它是基于规则的,并且不知道您的仪器特定类,所以您无法强制执行委派。

你能做什么:

  • 在已检测类的加载程序范围内对define classes使用访问覆盖。由于defineClassfinal,因此捆绑类加载器无法拦截它。但是,这些注入类的引用再次由bundle loader解析,因此您必须以这种方式添加所有所需的检测类。
  • 由于bundle类加载器将执行官方Java API类的父加载器委派,因此您可以检测其中一个核心Java类以添加一个辅助方法,该方法将由检测类调用并委托你的仪器课程必须是added to the boostrap loader
  • 您可以使用answer you have already linked中描述的技巧将MethodHandle放入系统属性中。检测类可以检索和调用它,因为MethodHandle是一个核心类,它将由bundle loader正确解析,并且可以调用底层方法而无需访问其定义类(假设参数和返回类型都是原始类型或核心类。)。