始める前に、『演習 1.4: 拡張プローブの作成』を読んでおくことをお勧めします。
Probekit を使えば、簡単な Java コード・フラグメントを使用して、単純なプローブを簡単に記述できます。演習 1.4 でご覧の通り、基本的なプローブで高度な内容も実行できます。しかし、単純なプローブでは実行できない、もっと複雑なタスクを実行したいこともあるでしょう。このような場合、実行したいロジックすべてをプローブ・フラグメントに収めようとする代わりに、プローブのための「ランタイム・サポート・ライブラリー」を作成できます。その後、プローブ・フラグメントから、実際のアクションがすべて格納されているこのライブラリーをコールできます。
ランタイム・ライブラリーを使用する場合、メソッドをコールするのに反映する必要があることもあります。この理由は、生成済みのプローブ・クラスは bootstrap クラス・ローダーによってロードされるため、system クラス・ローダーによってロードされたクラスに直接アクセスできないためです。
以下は、「エントリー」フラグメントがランタイム・ライブラリーにある entryHandler メソッドを呼び出す例です。
呼び出しの対象となる静的メソッド entryHandler を持つ com.sample.ProbeSupport クラスが存在すると想定します。想定では、entryHandler には引き数はありません。また、クラスはシステム・クラス・ローダーでロードできると想定します。
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 静的オブジェクトを宣言し、それを 1 回だけ初期化できます。
『要約』に記載されている資料を確認してチュートリアルを完了します。