I only had a couple of mins to play but if you went with around advice you
could make the reflection only run if initialization is required:
Object *around*(): embeddedGetter() {
Object value = *proceed*();
*if* (value == *null*) {
String fieldName = *thisJoinPoint*.getSignature().getName();
Object obj = *thisJoinPoint*.getThis();
*try*{
Field field = obj.getClass().getDeclaredField(fieldName);
field.setAccessible(*true*);
field.set(obj, value = *new* Validity() );
}
*catch*( IllegalAccessException | NoSuchFieldException
e){e.printStackTrace();}
}
*return* value;
}
Andy
On 8 July 2014 04:34, Eric B <[email protected]> wrote:
> I've got the following issue that I am trying to solve with AspectJ.
>
> Given an entity class with a null @Embedded field, when trying to access
> it with a getter, instantiate it first if it is null.
>
> For example:
>
> @Entity
> public class MyClass {
>
> @Id
> private long id;
>
> @Embedded
> private Validity validity;
> }
>
>
> And Validity:
>
> @Embeddable
> public class Validity{
> private long from;
> private long to;
> }
>
> I'm having trouble figuring out how to best write the before() advice
> however. Ideally, I'm trying to avoid using reflection for fear of slowing
> things down, but so far, the best I have been able to come up with is the
> following:
>
> // define a pointcut for any getter method of a field with @Embedded of
> type Validity with any name in com.ia.domain package
> pointcut embeddedGetter() : get( @javax.persistence.Embedded
> com.ia.domain.Validity com.ia.domain..* );
> before() : embeddedGetter(){
> String fieldName = thisJoinPoint.getSignature().getName();
> Object obj = thisJoinPoint.getThis();
> // check to see if the obj has the field already defined or is null
> try{
> Field field = obj.getClass().getDeclaredField(fieldName);
> field.setAccessible(true);
> if( field.get(obj) == null )
> field.set(obj, new com.ia.domain.Validity() );
> }
> catch( IllegalAccessException | NoSuchFieldException e){}
> }
>
>
> Is there a better way?
>
> Thanks,
>
> Eric
>
>
>
>
> _______________________________________________
> aspectj-users mailing list
> [email protected]
> To change your delivery options, retrieve your password, or unsubscribe
> from this list, visit
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
_______________________________________________
aspectj-users mailing list
[email protected]
To change your delivery options, retrieve your password, or unsubscribe from
this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users