在开始之前,建议您阅读练习 1.4:创建更高级的探针。
通过 Probekit,撰写带有简单 Java 代码片段的简单探针很容易。正如在练习 1.4 中所见,您甚至可以使用基础探针做一些复杂的事情。 但是有时您想做些更复杂的事情,使用简单探针就无能为力了。在这种情况下,您可以为探针创建“运行时支持库”, 而不是试图将想执行的所有逻辑都编写到探针片段中。然后可以使您的探针片段调用此库(所有真实操作都在其中)。
如果决定使用“运行时库”,有时需要使用反射来调用其方法。 这是因为生成的探针类由 bootstrap 类载入器装入,并且不能直接访问由 system 类载入器装入的类。
下面是调用“运行时库”中的方法 entryHandler 的“entry”片段的示例:
假设有一个使用您想调用的静态方法 entryHandler 的类 com.sample.ProbeSupport。并假设 entryHandler 没有实参。 另外,还假设类可以由 system 类载入器装入。
try { String className = "com.sample.ProbeSupport"; ClassLoader sysLoader = ClassLoader.getSystemClassLoader(); Class cls = Class.forName(className, true, sysLoader); java.lang.reflect.Method mth = cls.getMethod("entryHandler", null); mth.invoke(null, null); } catch (Throwable t) { System.out.println("Probe error while attempting reflection:"); t.printStackTrace(); }
要节省每个调用的时间,可以在类作用域中使用片段声明静态 java.lang.reflect.Method 对象并只初始化一次。
复习摘要中的资料,完成教程。