permaculture playing cards
The moose likes Other Java Products and Servers and the fly likes [AspectJ] Adding PropertyChangeEvents Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Products » Other Java Products and Servers
Bookmark "[AspectJ] Adding PropertyChangeEvents" Watch "[AspectJ] Adding PropertyChangeEvents" New topic

[AspectJ] Adding PropertyChangeEvents

Ernest Friedman-Hill
author and iconoclast

Joined: Jul 08, 2003
Posts: 24199

My friend Alan Moore writes:
I've often thought about [how Jess prefers JavaBeans to] implement property change events. This *could* be implemented at runtime
by byte code weaving for existing objects that doesn't fire property change

This is a really good idea if it would work. My question for you is, could it? AspectJ would have to
  • Add a member to a class (PropertyChangeSupport)
  • Record the argument to a method in a variable
  • Run the code for the method
  • Send an event using the PropertyChangeSupport object and the remembered variable

  • Additionally, you might want AspectJ to consider which methods to implement based on a call to java.beans.Introspector.introspect().
    Do you think this would be done?

    [Jess in Action][AskingGoodQuestions]
    Ramnivas Laddad
    Ranch Hand

    Joined: Jul 23, 2003
    Posts: 62
    This can be quite easily accomplished using AspectJ. Here is the code:
    All one needs to do is include concrete aspects such as following. All the details are taken care in the reusable base aspect:

    The above aspect enables the required property change notification functionality in the Person class. You may use wildcards to enable multiple classes in one go. For example, the following declare statement would make all the classes in com.javaranch.beans to implement the property-change functionality:

    Here is a test class that exercises the solution:

    Here is the output when we compile all the sources and run the Test class.

    Here is the base aspect that does all the magic. You need to write such an aspect only once (or never, if you use the one I provide :-) ). Then you can include in any project and enable the desired functionality by writing simple subaspects like PersonBeanMakerAspect or JavaRanchBeanMakerAspect.
    You will need to be familiar with the AspectJ syntax to really understand what�s going on. Basically, we add the default implementation to BeanSupport interface and advise all set*() methods of classes implementing BeanSupport to fire an event.

    Here is a boring implementation of the Person class, for completeness:

    I hope this helps.
    [ September 18, 2003: Message edited by: Ramnivas Laddad ]

    Ramnivas Laddad
    Author, AspectJ in Action (
    Twitter: ramnivas
    Ernest Friedman-Hill
    author and iconoclast

    Joined: Jul 08, 2003
    Posts: 24199

    Great! I'll have to try this out soon!
    I agree. Here's the link:
    subject: [AspectJ] Adding PropertyChangeEvents
    It's not a secret anymore!