收集了幾個常用的方面:
NoCallsIntoTestFromOutside ?? ?禁止從產品包到測試包的引用
public abstract aspect NoCallsIntoTestFromOutside {
?? ?//引用帶有test的包的所有可能操作
?? ?pointcut referToTestPackage():
?? ???? call(* *..test..*.*(..)) || call(*..test..*.new(..))
?? ???? || get(* *..test..*.*) || set(* *..test..*.*)
?? ???? || get(*..test..* *) || set(*..test..* *)
?? ???? || (staticinitialization(!*..test..*)
?? ??????? && staticinitialization(*..test..*+))
?? ???? || call(* *(*..test..*, ..))
?? ???? || call(* *(*, *..test..*, ..))
?? ???? || call(* *(*, *, *..test..*))
?? ???? || call(* *(.., *..test..*))
?? ???? || execution(* *(*..test..*, ..))
?? ???? || execution(* *(*, *..test..*, ..))
?? ???? || execution(* *(*, *, *..test..*, ..))
?? ???? || execution(* *(.., *..test..*))
?? ???? ;
?? ?// getcode scary-tests END
?? ?abstract protected pointcut withinTypes();
?? ?pointcut fromWithinNonTest(): within(!*..test..*);
?? ?declare error: withinTypes() && referToTestPackage()
?? ??? ?&& fromWithinNonTest(): "production code referring to test code";?? ?
}
UtilityClassEnforced ??? 禁止構造實用工具類
public aspect UtilityClassEnforced {
?? ?
??? declare error :
??? ??? //定義非private 的構造器
??? ??? execution(!private (@UtilityClass *).new(..))
??? ??? //調用new 初始化方法
??? ??? || call((@UtilityClass *).new(..))
??? ??? //執行工具類的任何方法
??? ??? || execution((@UtilityClass *) *(..))??? ???
??? ??? : "no instances of utility classes";
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface UtilityClass {
}
NoSystemOut ??? 禁止使用 System.err 或 System.out
public abstract aspect NoSystemOut {
??? abstract protected pointcut withinTypes;
??? //讀取System.out對象
??? declare error: withinTypes() && get(PrintStream System.out) : "no System.out";
???? //讀取System.err對象
??? declare error: withinTypes() && get(PrintStream System.err) : "no System.err";
??? //讀取FileDescriptor.err
??? declare error: withinTypes() && get(PrintStream FileDescriptor.err) : "no FileDescriptor.err";
??? //讀取FileDescriptor.out
??? declare error: withinTypes() && get(PrintStream FileDescriptor.out) : "no FileDescriptor.out";
???? //執行Throwable.printStackTrace()方法
??? declare error: withinTypes() && call(void Throwable.printStackTrace()) : "no System.err";
}
GetterSetter ?? ?禁止在除初始化或 getter 方法以外進行字段讀取操作,禁止在初始化或 setter 方法以外進行字段寫操作
public abstract aspect GetterSetter {
?? ?
?? ?abstract protected pointcut withinTypes();
?? ?//所有的sets 非public fields
?? ?pointcut sets() : set(!public * *);
?????? //所有的gets 非public fields
?? ?pointcut gets() : get(!public * *);
?? ?declare error : withinTypes() && gets() &&
?? ??? ?//在get*方法或者構造器以外地方使用
?? ??? ?!(withincode(!void get*()) || withincode(new(..)))
?? ??? ?: "non-public field-get outside constructor or getter method";
?? ?declare error : withinTypes() && sets() &&
?? ??? ?!(withincode(void set*(*)) || withincode(new(..)))
?? ??? ?: "non-public field-set outside constructor or setter method";
}
NoNullParameters ?? ?????? 在公共方法傳遞空參數時拋出異常
public abstract aspect NoNullParameters {
?? ?abstract protected pointcut withinTypes();
?? ?
?? ?pointcut publicParameters() :
?? ??? ? //執行public 構造器或者public 方法
?? ??? ?(execution(public new(*,..)) || execution(public * *(*,..)))
?? ??? ? //除了執行非Object的參數,如原類型,int,long
?? ??? ?&& !(execution(* *(!Object+)) || execution(*.new(!Object+)));
?? ?//如果參數為null,則拋出例外?? ??? ??? ?
?? ?before() : withinTypes() && publicParameters() {
?? ??? ?Object[] args = thisJoinPoint.getArgs();
?? ??? ?for (int i = 0; i < args.length; i++) {
?? ??? ??? ?if (null == args[i]) {
?? ??? ??? ??? ?JoinPoint.StaticPart sp = thisJoinPointStaticPart;
?? ??? ??? ??? ?String name = AJReflect.getParameterName(sp, i);
?? ??? ??? ??? ?throw new IllegalArgumentException("null " + name);
?? ??? ??? ?}
?? ??? ?}
?? ?}
}
posted on 2006-11-16 18:56
布衣郎 閱讀(1068)
評論(0) 編輯 收藏 所屬分類:
aop