使用Java检测,我们可以从JVM访问由Java类加载器加载的类,并通过插入我们的自定义代码来修改其字节码,所有这些都在运行时完成。我们不必担心安全性,它们受适用于Java类和相应类加载器的相同安全上下文的控制。
我们可以使用它来访问一些java应用程序,因为它们在同一个类加载器中运行。
现在我们要做的是使用java检测访问eclipse RCP应用程序,但在RCP中,每个bundle都有自己的类加载器,我们的检测代码使用java应用程序类加载器运行。 当我们访问它时,它正在抛出“Workbench尚未创建”异常,而工作台已经启动并运行。(我希望这是因为它们都有不同的类加载器)。
我曾尝试从here做事,但没有成功。 有没有什么办法可以用java检测工作RCP应用程序。
答案 0 :(得分:0)
修改类时,插入代码的引用由修改后的类的ClassLoader
解析。如果该类加载器没有委托给应用程序加载器,例如因为它是基于规则的,并且不知道您的仪器特定类,所以您无法强制执行委派。
你能做什么:
defineClass
为final
,因此捆绑类加载器无法拦截它。但是,这些注入类的引用再次由bundle loader解析,因此您必须以这种方式添加所有所需的检测类。MethodHandle
放入系统属性中。检测类可以检索和调用它,因为MethodHandle
是一个核心类,它将由bundle loader正确解析,并且可以调用底层方法而无需访问其定义类(假设参数和返回类型都是原始类型或核心类。)。