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 <ebenza...@gmail.com> 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
> aspectj-users@eclipse.org
> 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
aspectj-users@eclipse.org
To change your delivery options, retrieve your password, or unsubscribe from 
this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to