Aspect-oriented programming (AOP) complements object-oriented programming by allowing the developer to dynamically modify the static object-oriented model to create a system that can grow to meet new requirements, allowing an application to adopt new characteristics as it develops.
AOP provides a solution for abstracting cross-cutting code that spans object hierarchies without functional relevance to the code it spans. Instead of embedding cross-cutting code in classes, AOP allows developers to abstract the cross-cutting code into a separate module (known as an aspect) and then apply the code dynamically where it is needed. Developers achieve dynamic application of the cross-cutting code by defining specific places (known as pointcuts) in the object model where cross-cutting code should be applied. At runtime or compile time, depending on the AOP framework, cross-cutting code is injected at the specified pointcuts.
Essentially, AOP allows you to introduce new functionality into objects without the objects’ needing to have any knowledge of that introduction.