# Pointcut

> Mediated Wiki article. Canonical URL: https://mediated.wiki/source/Pointcut
> Markdown URL: https://mediated.wiki/source/Pointcut.md
> Source: https://en.wikipedia.org/wiki/Pointcut
> Source revision: 1302492394
> License: Creative Commons Attribution-ShareAlike 4.0 International (https://creativecommons.org/licenses/by-sa/4.0/)

In [aspect-oriented programming](/source/aspect-oriented_programming), a '''pointcut''' is a set of [join point](/source/join_point)s. A pointcut specifies where exactly to apply an [advice](/source/Advice_in_aspect-oriented_programming), which allows separation of concerns and helps in modularizing business logic.<ref>{{Cite web|url=https://pp.ipd.kit.edu/uploads/publikationen/stoerzer05splat.pdf|title=A Classification of Pointcut Language Constructs|last=|first=|date=|website=|publisher=|access-date=29 December 2019}}</ref> Pointcuts are often specified using class names or method names, in some cases using regular expressions that match class or method names. Different frameworks support different Pointcut expressions; [AspectJ](/source/AspectJ) syntax is considered as de facto standard. Frameworks are available for various programming languages like [Java](/source/Java_(programming_language)), [Perl](/source/Perl), [Ruby](/source/Ruby_(programming_language)), and many more which support pointcuts {{Citation needed|reason=No further enumeration of the frameworks was provided|date=July 2025}}.

== Background ==
Due to limitations in various programming languages, [cross-cutting concern](/source/cross-cutting_concern) has not modularized. Cross-cutting concern refers to parts of software that logically belong to one module and affect the whole system: this could be security or logging, for example.<ref>{{Cite web|url=https://eclipse.org/aspectj/doc/next/progguide/starting-aspectj.html|title=Introduction to AspectJ|last=|first=|date=|website=|publisher=|access-date=14 September 2016}}</ref> [Aspect-oriented programming](/source/Aspect-oriented_programming) tries to solve these cross cutting concerns by allowing programmers to write modules called aspects, which contain pieces of code executed at particular point. The expressions required to select a particular point led to creation of Pointcut Expressions.

==Execution==
Whenever the program execution reaches one of the join points described in the pointcut, a piece of code associated with the pointcut (called advice) is executed. This allows a programmer to describe where and when additional code should be executed in addition to already-defined behavior. Pointcut permits the addition of aspects to existing software, as well as the design of software with a clear [separation of concerns](/source/separation_of_concerns), wherein the programmer [weaves](/source/aspect_weaver) (merges) different aspects into a complete application.

== Example ==
Suppose there is an application where we can modify records in a [database](/source/database). Whenever users modify the database, we want to have a log of information regarding who is modifying the records. The traditional way to log is to call a log method just before modifying the database. With aspect-oriented programming, we can apply pointcut to the Modify Database method and have an advice that is called to log the required information.<ref>{{Cite web|url=http://docs.jboss.org/aop/1.0/aspect-framework/userguide/en/html_single/index.html#what|title=JBoss AOP - User Guide|website=docs.jboss.org|access-date=2016-09-14}}</ref>

== Expressions ==
Following are some important pointcut expressions supported by [AspectJ](/source/AspectJ). These expressions can be combined using logical operators.<ref>{{Cite web|url=https://eclipse.org/aspectj/doc/next/progguide/language-joinPoints.html|title=Join Points and Pointcuts|last=|first=|date=|website=|publisher=|access-date=14 September 2016}}</ref>
<syntaxhighlight lang="java">
execution(void User.setPassword(password))
</syntaxhighlight>
This pointcut matches execution of the User.setPassword method.
<syntaxhighlight lang="java">
call(void User.getPassword())
</syntaxhighlight>
When User.getPassword is called, this pointcut is matched.
<syntaxhighlight lang="java">
handler(ArrayIndexOutOfBounds)
</syntaxhighlight>
Pointcut will match when there is an ArrayIndexOutOfBounds exception
<syntaxhighlight lang="java">
this(UserType)
</syntaxhighlight>
Pointcut will match when the object currently executing is of UserType.
<syntaxhighlight lang="java">
target(UserType)
</syntaxhighlight>
Pointcut will match when the target object is of UserType.
<syntaxhighlight lang="java">
within(UserType)
</syntaxhighlight>
Pointcut will match when the code executing belongs to UserType.

== Criticisms ==
Pointcut languages impact important software properties like [evolvability](/source/evolvability) and comprehensibility in a negative way. There might be a possibility where there is a need to perform [refactoring](/source/Code_refactoring) to define a correct aspect, which in general should not happen since refactoring is to make code cleaner. It is also not [scalable](/source/scalable) when there are multiple aspects to be applied on the same code and each aspect requires a different refactoring.<ref name=":0">{{Cite CiteSeerX |title=Inductively generated PointCuts to support refactoring to Aspects |year=2004 |citeseerx = 10.1.1.2.594}}</ref> In general every aspect will be tightly coupled with an application's structure as the pointcuts explicitly contain a method's signature, so when an application changes the pointcut needs to be changed as well. This can be quite problematic for a developer.<ref name=":0" />

==References==
{{reflist}}

==External links==
*Paper "[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.59.1936 Back to the Future: Pointcuts as Predicates over Traces]" by [Karl Klose](/source/Karl_Klose) and [Klaus Ostermann](/source/Klaus_Ostermann)
*Paper "[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.1.9857 Remote Pointcut - A Language Construct for Distributed AOP]" by [Muga Nishizawa](/source/Muga_Nishizawa), [Shigeru Chiba](/source/Shigeru_Chiba) and [Michiaki Tatsubori](/source/Michiaki_Tatsubori)
*Paper "[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.96.974 Datalog as a Pointcut Language in Aspect-Oriented Programming]"
*Paper "[http://www.ccs.neu.edu/research/demeter/biblio/unified.html Expressiveness and Complexity of Crosscut Languages]" by [Karl J. Lieberherr](/source/Karl_J._Lieberherr), [Jeffrey Palm](/source/Jeffrey_Palm) and [Ravi Sundaram](/source/Ravi_Sundaram)

{{aosd}}

Category:Aspect-oriented software development
Category:Aspect-oriented programming

---
Adapted from the Wikipedia article [Pointcut](https://en.wikipedia.org/wiki/Pointcut) by Wikipedia contributors ([contributor history](https://en.wikipedia.org/wiki/Pointcut?action=history)). Available under [Creative Commons Attribution-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-sa/4.0/). Changes may have been made.
