Aspect-oriented programming (AOP) aims to increase modularity by separating cross-cutting concerns. AspectJ is an extension to Java that implements AOP. It allows defining aspects that specify join points (e.g. method calls) in the application execution flow and advice (e.g. before, after) to add cross-cutting functionality like logging. AspectJ can weave aspects into bytecode at compile-time, post-compile, or load-time using a Java agent.