我是使用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
};
}
它无法正常工作。我该如何解决这个问题?
答案 0 :(得分:2)
要更改分配给字段的值,我们需要使用around
建议,而不是before
或after
。 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());
};
}