[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] LTW, inter-type fields and pertarget() aspects

Hi,

I started playing with LTW, inter-type fields and pertarget() aspects and ran into an interesting problem.
I was trying to use inter-type fields to carry some information I need on a per-object basis. But every time the advice using these inter- type fields got executed I got a NoSuchFieldException (the compiler gave me a typeNotExposedToWeaver warning, but I think that's ok, because I use LTW). So I changed my aspect to be pertarget() and it behaves like expected (aspect code below).


Now here are my questions:
- Shouldn't a pertarget/perthis aspect declare field pretty much the same way as an inter-type declaration in a singleton aspect?
- I'm not sure if I should use a pertarget or perthis aspect for what I want to do. The content of the fields should be carried around with the advised object across the objects lifetime (which is why I originally wanted to use inter-types).
- When running the LTW with -showWeaveInfo I get a log message for every jointpoint that gets woven. What should the message look like for weaving inter-type fields. Or should there be a message at all?


Thanks,
Jochen

P.S.: My aspect looks like this:

public aspect JspIdConsumerUnique pertarget( instanceCreation(UIComponentClassicTagBase) || setUniqueProperty(UIComponentClassicTagBase) ) {

private boolean lumi_uniquePropertySet = false;
private Object lumi_uniqueProperty = null;


pointcut instanceCreation( UIComponentClassicTagBase _consumer ): target(_consumer) && execution( UIComponentClassicTagBase+.new(..) );

after(UIComponentClassicTagBase _consumer) : instanceCreation( _consumer ) {
safeAddObject( _consumer );
}

pointcut setUniqueProperty( UIComponentClassicTagBase _consumer ): target(_consumer) &&
call( * UIComponentClassicTagBase+.setJspId(..) );

before( UIComponentClassicTagBase _consumer ): setUniqueProperty( _consumer ) {
uniqueProperty = _consumer.getJspId();
}

after( UIComponentClassicTagBase _consumer ): setUniqueProperty( _consumer ) {
if ( propertyHasChanged( _consumer.getJspId() ) ) {
lumi_uniquePropertySet = true;
updateContainer( uniqueProperty, _consumer );
}
}

//private methods go here


}