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ビジネストランザクションのインターフェースマッチルールを作成する必要があります。