Skip to main content

[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

}




Back to the top