Since pointcut expressions in AspectJ 5 support join point matching based
on annotations, this facility can be exploited when writing
declare warning
and declare error
statements. For example:
declare warning : withincode(@PerformanceCritical * *(..)) && call(@ExpensiveOperation * *(..)) : "Expensive operation called from within performance critical section";
declare error : call(* org.xyz.model.*.*(..)) && !@within(Trusted) : "Untrusted code should not call the model classes directly";
The general form of a declare parents
statement is:
declare parents : TypePattern extends Type; declare parents : TypePattern implements TypeList;
Since AspectJ 5 supports annotations as part of a type pattern specification, it is now possible to match types based on the presence of annotations with either class-file or runtime retention. For example:
All types with the @Secured
annotation
implement the SecuredObject
inteface.
The subset of types drawn from the BankAccount
type and any subtype of
BankAccount
, where the
@Secured
annotation is present, implement the
SecuredObject
interface.
An annotation type may not be used as the target of a declare parents statement. If an annotation type is named explicitly as the target of a declare parents statement, a compilation error will result. If an annotation type is matched by a non-explicit type pattern used in a declare parents statement it will be ignored (and an XLint warning issued).
The general form of a declare precedence statement is:
declare precedence : TypePatList;
AspectJ 5 allows the type patterns in the list to include annotation information as part of the pattern specification. For example:
All aspects with the @Security
annotation
take precedence over any other aspects in the system. (Or, more
informally, all security-related aspects take precedence).