如何使用 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
建议,而不是 before
或 after
。 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());
};
}
我是使用 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
建议,而不是 before
或 after
。 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());
};
}