アノテーションによるアサーション(その1)

概要

 アノテーションアサーションを行うライブラリを作成してみました。(最新バージョンはこちらから確認してください)。

機能

特徴

  • @NotNull 等のアノテーションの付加されたメソッドやメソッドパラメータを内部に持つクラスに対して、バイトコードレベルでアサーション機能を weaving します。
    • 実行時にコンテナのようなものが必要ありません。
    • 実行時のオーバーヘッドが小さいです。
  • maven2 プラグインを用意しました。
    • compile, test-compile フェーズのどちらかもしくは両方に対応しています。
  • agentを用意しました。
    • java 起動時に -javaagent オプションを指定することにより load-time weaving が可能です。
    • IDE(eclipse, IDEA等)上での利用が可能です。

アノテーション

 以下に、@NotNull アノテーションを用いて、引数と戻り値のアサーションを行う例を示します。

import jp.objectfanatics.assertion.constraints.NotNull;

public class SampleBean {
	
	private String parameter = null;
	
	/**
	 * 引数が null でないことを保証するアサーションのサンプルメソッド
	 * @param param null 以外の値
	 * @throws AssertionError param が null の場合
	 */
	public void setParameter(@NotNull String param) {
		parameter = param;
	}
	
	/**
	 * 戻り値が null でないことを保証するアサーションのサンプルメソッド
	 * @return null 以外の値
	 * @throws AssertionError null を戻り値として返そうとした場合
	 */
	@NotNull
	public String getParameter() {
		return parameter;
	}
}

実行サンプル(パラメータが null の例)

 以下の例では、入力が null のため AssertionError がスローされます。その際、不正な入力が行われたパラメータの番号(0が先頭)が示されます。

public class NullParamCase {
	public static void main(String[] args) {
		
		// テスト用インスタンス作成。
		SampleBean bean = new SampleBean();
		
		// 入力が null のため AssertionError がスローされる。
		bean.setParameter(null);
	}
}

例外:

Exception in thread "main" java.lang.AssertionError: parameter 0 is null.
	at SampleBean.setParameter(SampleBean.java)
	at NullParamCase.main(NullParamCase.java:8)

実行サンプル(戻り値が null の例)

 以下の例では、戻り値として null を返そうとするため AssertionError がスローされます。

public class NullReturnValueCase {
	public static void main(String[] args) {
		
		// テスト用インスタンス作成。
		SampleBean bean = new SampleBean();
		
		// 戻り値として null を返そうとするため AssertionError がスローされる。
		bean.getParameter();
	}
}

例外:

Exception in thread "main" java.lang.AssertionError: return value is null.
	at SampleBean.getParameter(SampleBean.java:23)
	at NullReturnValueCase.main(NullReturnValueCase.java:8)


アノテーションによるアサーション(その2 mavenプラグイン編)に続く