Eclipse + AJDT では、以下のように認可をチェックするメソッド アノテーションを実装しました。
注釈:
@Retention(RetentionPolicy.RUNTIME)
public @interface Secured {}
側面:
public aspect SecurityCheck {
pointcut checkSecurity(Secured annotation) : execution(@Secured * *.*(..)) && @annotation(annotation);
Object around(Secured annotation) throws PermissionException:
checkSecurity(annotation) {
...
if (...) throw new PermissionException();
...
return proceed(annotation);
}
}
使用法:
@Secured
public void someMethod() {}
注釈は、アスペクトを適用する必要があるすべてのメソッドをマークします。アスペクトは承認をチェックし、失敗するとスローPermissionException
します。
ただし、これはチェック例外であるsomeMethod()
ため、宣言する必要があります。
@Secured
public void someMethod() throws PermissionException {}
Eclipse はこれを好まない: 内部someMethod()
に throw するものが何もないPermissionException
ので、不平を言う。回避策を実行する必要があります:
@Secured
public void someMethod() throws PermissionException {
warn();
}
@SuppressWarnings("unused")
public static void warn() throws PermissionException {}
これは Eclipse を満足させ、問題なく動作します。warn()
しかし、 Eclipse をシャットダウンさせるためだけに毎回呼び出すのは非常に見苦しいです。
何がもっとうまくできるでしょうか?これは単純な Eclipse のバグですか?