`
fengpeng
  • 浏览: 103131 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

几个有用的静态方面,用于审查代码(aspectJ实现)

    博客分类:
  • AOP
 
阅读更多
收集了几个常用的方面:

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);
            }
        }
    }
}
分享到:
评论

相关推荐

    精通AspectJ_源代码

    在学习AspectJ时,有几个关键概念是必须掌握的: 1. **切面(Aspect)**:切面是AspectJ的核心,它封装了系统中的一个关注点,例如数据验证、事务管理等。切面由通知(advice)、切点(pointcut)和引入...

    Spring aop 之 静态代理 动态代理 Aspectj aop-config 等实现方式

    主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...

    Spring 使用AspectJ 实现 AOP之前置通知小例子

    总结,Spring结合AspectJ实现AOP的前置通知,能够帮助我们优雅地处理横切关注点,提高代码的可读性和可维护性。通过配置AOP,定义切面,设置前置通知,并使用合适的切入点表达式,我们可以实现对特定方法执行前的...

    Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)

    AspectJ是Java平台上的一个开源AOP框架,提供了丰富的语法来定义切面。本教程将探讨如何在Spring中结合AspectJ实现AOP,包括基于XML配置和基于注解的方式。 **一、AOP基本概念** AOP的核心概念有切面(Aspect)、...

    Spring 使用AspectJ 实现 AOP

    在Spring中,我们可以使用AspectJ来实现AOP,AspectJ是一个强大的AOP框架,它可以与Spring无缝集成,提供更细粒度的控制。 首先,让我们了解一下AOP中的通知类型: 1. **前置通知**(Before Advice):在目标方法...

    Spring @AspectJ 实现AOP 入门例子

    本篇文章将深入探讨如何利用Spring的@AspectJ注解来实现AOP,这是一个入门级别的例子,旨在帮助开发者理解并掌握这一关键特性。 首先,我们要明白什么是AOP。面向切面编程是一种编程范式,它允许程序员定义“切面”...

    spring基于AspectJ实现事务控制

    如果你使用的是编译时织入,你需要使用AspectJ的maven或gradle插件来编译代码;如果是运行时织入,则不需要额外配置,只需确保Spring加载了切面类。 5. **测试事务控制**:编写单元测试或者集成测试来验证事务的...

    Aspectj

    AspectJ是一种广泛使用的Java语言的面向切面编程(AOP)扩展。它允许开发者将关注点模块化,使得系统中的交叉切面(如日志、...对于大型复杂项目,AspectJ是一个强大的工具,帮助实现关注点的分离,从而优化软件架构。

    aspectj-1.9.6.jar

    6. **编织增强(Advising Enhancements)**:AspectJ允许在已有的类和接口上添加方法、字段和初始化代码,实现对已有代码的无侵入式增强。 7. **集成其他Java框架**:AspectJ可以与Spring框架无缝集成,进一步简化...

    AOP的AspectJ实现方案来做语言切换

    AspectJ是一个独立的AOP框架,它提供了一种静态类型的、基于Java的语言扩展,允许开发者定义切面、通知(advises)和连接点(join points)。它不仅支持Spring框架,还可以独立于Spring使用。 1. **切面(Aspects)...

    aspectJ

    例如,日志记录可以作为一个切面来实现,而不是在每个需要记录日志的方法中添加重复的代码。 【源码】在学习和理解AspectJ的过程中,查看其源码能够帮助我们深入理解其工作原理。AspectJ的源码通常包含了对AOP概念...

    AspectJ 文档

    在AspectJ中,可以声明的连接点包括方法调用、方法执行、构造器调用、构造器执行、字段获取、字段设置、初始化代码块、静态初始化代码块和异常处理器代码块等。 Pointcut是AspectJ中用于捕获一组特定连接点的表达式...

    AspectJ的JAR包

    在Spring AOP框架中,AspectJ被广泛用于实现更精细粒度的切面逻辑,提供比Spring默认的基于代理的AOP更为强大的功能。 首先,我们要理解什么是面向切面编程。传统的面向对象编程(OOP)将代码组织为类和方法,而切...

    aspectj-1.6.9.jar

    总之,`aspectj-1.6.9.jar` 是一个关键的组件,它使得Java开发者能够利用AspectJ框架实现面向切面编程,提高代码的可读性和可维护性。在项目中引入这个库,可以有效地管理和组织应用程序中的横切关注点,提升整体...

    AspectJ程序设计指南

    - **用方面进行代码跟踪**:通过具体案例展示了如何使用AspectJ来进行代码跟踪。 **3.5 用于产品的方面** - **Bean方面**:展示了如何使用AspectJ来增强Bean的行为。 - **Subject-Observer协议**:通过案例展示了...

    Android+反射+代理+静态代理+AspectJ

    AspectJ 作为静态AOP框架,提供了一种高效且声明式的切面编程方式,它允许在编译时将切面逻辑织入代码,增强了代码的可维护性和复用性。通过理解切点、通知、织入等概念,开发者可以更有效地实现横切关注点的分离,...

    AspectJ面向切面的例子

    标题"AspectJ面向切面的例子"指的是通过AspectJ实现的一个实际项目,这个例子是一个名为"Spacewar"的小游戏。在"Spacewar"游戏中,我们可以看到AspectJ如何被用来处理游戏中的各种横切关注点,比如游戏状态记录、...

    Spring框架(6)AspectJ实现AOP共7页.pd

    总之,"Spring框架(6)AspectJ实现AOP共7页.pdf.zip"这份资料详细介绍了如何在Spring中使用AspectJ进行AOP编程,内容涵盖了切面、切点、通知、织入等多个关键概念,对于理解和实践Spring AOP具有很高的参考价值。...

    aspectj,aspectjrt,weaver等

    AspectJ 是一个强大的Java语言的面向切面编程实现。它允许开发者在不修改源代码的情况下,通过切面(Aspect)来表达横切关注点,如日志、事务管理、性能监控等。AspectJ 提供了静态和动态两种织入方式,静态织入在...

Global site tag (gtag.js) - Google Analytics