This week's giveaway is in the Android forum.
We're giving away four copies of Android Security Essentials Live Lessons and have Godfrey Nolan on-line!
See this thread for details.
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


Win a copy of Android Security Essentials Live Lessons this week in the Android forum!
JavaRanch » Java Forums » Products » Other Java Products and Servers
Bookmark "[AspectJ] Adding PropertyChangeEvents" Watch "[AspectJ] Adding PropertyChangeEvents" New topic
Author

[AspectJ] Adding PropertyChangeEvents

Ernest Friedman-Hill
author and iconoclast
Marshal

Joined: Jul 08, 2003
Posts: 24183
    
  34


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
events.

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
    Author
    Ranch Hand

    Joined: Jul 23, 2003
    Posts: 62
    Ernest,
    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.
    -Ramnivas
    [ September 18, 2003: Message edited by: Ramnivas Laddad ]

    Ramnivas Laddad
    Author, AspectJ in Action (http://manning.com/laddad2)
    Twitter: ramnivas
    Ernest Friedman-Hill
    author and iconoclast
    Marshal

    Joined: Jul 08, 2003
    Posts: 24183
        
      34

    Great! I'll have to try this out soon!
     
    With a little knowledge, a cast iron skillet is non-stick and lasts a lifetime.
     
    subject: [AspectJ] Adding PropertyChangeEvents
     
    Similar Threads
    Do something when object changes
    listening for events in other windows
    Fire event out of static method
    Catching change of Boolean
    some qns...help appreciated