如何使用AspectJ修改字段值

时间:2015-08-04 07:57:29

标签: java aspectj

我是使用AspectJ的AOP的新手,我需要编写以下简单的方面:

我有@EndDay

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface EndDay { }

注释,我需要拦截所有非反射分配给注释为Date注释的@EndDate类型的所有非静态字段,然后分配指定的日期结束的值。已分配Date个对象(例如,我们是assigngn 2011-11-11 10:00:00,它被拦截并指定为2011-11-11 23:59:59。 我尝试过:

public aspect EndDay {
    before(): set(@DayEnd private Date *) {
        Date d = (Date) thisJoinPoint.getTarget();
        DateUtils.setDayEnd(d); //It an utility class modifying the date
    };
}

它无法正常工作。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

要更改分配给字段的值,我们需要使用around建议,而不是beforeafter。 around建议指定我们将执行正常执行的操作 而不是 。现在,正如documentation所说:

  

所有设置的连接点都被视为有一个参数,值为   字段被设置为,因此在设置的连接点,该值可以   用args切入点访问。

这意味着我们应该就set(@DayEnd private Date *)args(original)的结合宣布我们的建议。第一个选择所有私有字段分配,但第二个分配指定要分配的值。现在,为了分配模糊值,我们最终需要调用proceed(_modified_argument)

工作方面如下:

public aspect DayBoundaries {

   void around(Date original): set(@DayEnd private Date *) && args(original){
        Calendar c = Calendar.getInstance();
        c.setTime(original);
        c.set(Calendar.HOUR_OF_DAY, 23);
        c.set(Calendar.MINUTE, 59);
        c.set(Calendar.SECOND, 59);
        c.set(Calendar.MILLISECOND, 999);
        proceed(c.getTime());
    };
}