Hi, I'm pretttty sure there are AspectJ bugs in this area that you are hitting (around advice and generics). Feels like this kind of thing is what you wanted:
<T> List<T> makeDefensiveCopyOfReturnedList(final ProceedingJoinPoint joinPoint) { .. } what compile errors do you get? Maybe raise a bugzilla for it. cheers, Andy On 4 February 2013 03:27, Rens van Leeuwen <rens.van.leeu...@leanapps.com>wrote: > Hi everybody, > > I've been trying to get a hierarchy of classes return defensive copies of > instances of the Java Collections Framework. The idea is, that a caller > should not be able to add/remove elements of a returned List<?> for > instance, because the entity that returned that list should be the one > managing it. > > I thought of using an aspect, and when trying to do so, I found out that > it works, but it produces quite a bunch of warnings in both my Eclipse > workspace as well as during weaving during a Maven build. I'm wondering if > there's anything I can do to get rid of those warnings. > > I wrote the following class to define the aspect (stripped to only contain > an example method): > > @Aspect > public final class DefensiveCopyCollectionsReturningAspect { > > /** > * Every 'getter' method in the portal model hierarchy that returns a > * {@link List} should return a defensive copy so that calling clients > * don't change the internal structure of the portal model. > * > * @param joinPoint The joinpoint. > * @return An defensive copy of the returned list. > */ > @SuppressWarnings("unchecked", "rawtypes") > @Around("execution(public !static java.util.List<*> > (AbstractPM+).get*())") > public List makeDefensiveCopyOfReturnedList(final ProceedingJoinPoint > joinPoint) { > try { > return new ArrayList((List) joinPoint.proceed()); > } catch (final Throwable exception) { > throw new PortalRuntimeException(exception); > } > } > } > > I've defined methods that do similar things for Set and Map as well, which > works like a charm. However, since the return type of the method is > java.util.List, without any generics involved, I see the following warnings: > > -- unchecked conversion when advice applied at shadow > method-execution(java.util.List > com.leanapps.portal.model.pension.participation.ParticipationPM.getDocuments()), > expected java.util.List<com.leanapps.portal.model.report.DocumentPM> but > advice uses java.util.List [Xlint:uncheckedAdviceConversion] > > Now here's the million (OK, maybe a little less ;)) dollar question: Is > there any way to get the generics to work? I've tried several things, but > they all don't seem to work. I've tried > > <T> List<T> makeDefensiveCopyOfReturnedList(final ProceedingJoinPoint > joinPoint) { .. } > > which results in compilation errors: > > -- incompatible return type applying to method-execution(java.util.List > com.leanapps.portal.model.pension.participation.ParticipationPM.getDocuments()) > > If I try to add generics to the annotation: > > @Around("execution(public !static java.util.List<T+> > (AbstractPM+).get*())") > > I see that no advice has been applied at all: > > -- advice defined in > com.leanapps.portal.model.DefensiveCopyCollectionsReturningAspect has not > been applied > > Hope that somebody on this list has an answer to this. > > Kind regards, > > Rens > > _______________________________________________ > aspectj-users mailing list > aspectj-users@eclipse.org > https://dev.eclipse.org/mailman/listinfo/aspectj-users >
_______________________________________________ aspectj-users mailing list aspectj-users@eclipse.org https://dev.eclipse.org/mailman/listinfo/aspectj-users