Java 8時点で、Javaインターフェースには、staticメソッドとデフォルトメソッドを含めることができます。このページでは、これらのタイプのインターフェイスメソッドをモニタリングする方法について説明します。
Java 8 で導入された別の Java 言語機能である Lambda メソッドインターフェイスは、Java エージェントではサポートされていません。
インターフェースのstaticメソッド
次のコードスニペットはstaticインターフェースメソッドの例を示しています。
package jdk8;
interface InterfaceForStaticMethod
{
static int sum(int acc, int x)
{
return acc + x;
}
}
CODE
メソッドの実際のバイトコードはコンパイルされたクラスファイルに存在するので、Splunk AppDynamics 構成におけるインターフェイスクラスに対するクラスマッチの結果は、ビジネストランザクションのそのクラスのインストゥルメンテーションになります。
このようなメソッドをインストゥルメント化するには、たとえば次のように、interfaceForStaticMethod
の POJO ビジネストランザクション一致ルールを作成します。

この場合、ルールは jdk8.InterfaceForStaticMethod
という名前を持つクラスと一致します。
インターフェースのデフォルトメソッド
インターフェースはデフォルトメソッドも定義できます。インターフェースstaticメソッドと同様に、デフォルトメソッドのバイトコードは、コンパイルされたクラスファイルに存在します。
デフォルトメソッドのインストゥルメンテーションを構成するときは、次に従います。
- ターゲットがデフォルトメソッドをオーバーライドしないクラスである場合、対象とするインターフェイスにクラスマッチを使用する
- ターゲットがデフォルトメソッドをオーバーライドするクラスの場合は、インターフェイスマッチを使用する
インターフェイス デフォルト メソッドを直接インストゥルメント化
以下のインターフェースの場合
package jdk8;
interface InterfaceForConcreteClassDefaultMethod
{
default int sum(int acc, int x)
{
return acc + x;
}
}
CODE
およびその実装クラス
package jdk8;
class ClassForDefaultMethod implements InterfaceForConcreteClassDefaultMethod
{
}
CODE
この例では、ClassForDefaultMethod
はデフォルトのメソッドをオーバーライドしません。従って、インターフェースに対して以下のようにクラスマッチを使用することができます。

オーバーライドされたデフォルトメソッドのインストゥルメント化
以下のインターフェースの場合
package jdk8;
interface InterfaceForAnonymousClassDefaultMethod
{
default int sum(int acc, int x)
{
return acc + x;
}
}
CODE
結果 :
InterfaceForAnonymousClassDefaultMethod i = new InterfaceForAnonymousClassDefaultMethod()
{
@Override
public int sum(int acc, int x)
{
return acc + x;
}
};
CODE
メソッドがオーバーライドされるため、ターゲット bytecode
は匿名クラス InterfaceForAnonymousClassDefaultMethod
に存在します。そのため、以下のようなPOJOビジネストランザクションのインターフェースマッチルールを作成する必要があります。
