练习 1.5:为更复杂的探针逻辑使用“运行时库”

在开始之前,建议您阅读练习 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 对象并只初始化一次。

复习摘要中的资料,完成教程。

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.