收集了几个常用的方面:
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
布衣郎 阅读(1053)
评论(0) 编辑 收藏 所属分类:
aop