Win a copy of Design for the Mind this week in the Design forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

[AspectJ] Adding PropertyChangeEvents

 
Ernest Friedman-Hill
author and iconoclast
Marshal
Pie
Posts: 24208
35
Chrome Eclipse IDE Mac OS X
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

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?
     
    Ramnivas Laddad
    Author
    Ranch Hand
    Posts: 62
    • Mark post as helpful
    • send pies
    • Quote
    • Report post to moderator
    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 ]
     
    Ernest Friedman-Hill
    author and iconoclast
    Marshal
    Pie
    Posts: 24208
    35
    Chrome Eclipse IDE Mac OS X
    • Mark post as helpful
    • send pies
    • Quote
    • Report post to moderator
    Great! I'll have to try this out soon!
     
    • Post Reply
    • Bookmark Topic Watch Topic
    • New Topic