
收集了几个常用的方面:
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);
?? ??? ??? ?}
?? ??? ?}
?? ?}
}