如何使用 AspectJ 修改字段值

How to modify field values with AspectJ

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

我有 @EndDay:

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

注解,我需要拦截所有非反射赋值给Date类型的所有非静态字段,用@EndDate注解进行注解,然后赋值指定日期的结束值在分配的 Date 对象中(例如,我们正在分配 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
    };
}

它没有正常工作。我该如何解决?

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

All set join points are treated as having one argument, the value the field is being set to, so at a set join point, that value can be accessed with an args pointcut.

这意味着我们应该声明我们对 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());
    };
}