闲人野居
好好学习,天天向上
posts - 57,  comments - 137,  trackbacks - 0
收集了几个常用的方面:

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 布衣郎 阅读(1054) 评论(0)  编辑  收藏 所属分类: aop

只有注册用户登录后才能发表评论。


网站导航:
 

<2006年11月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用链接

留言簿(12)

随笔分类(59)

随笔档案(57)

blog

java

uml

搜索

  •  

积分与排名

  • 积分 - 356471
  • 排名 - 155

最新评论

阅读排行榜

评论排行榜