Hi, > I would like to know whether it is supported to use @DeclareMixin & around > advice in the way like below:
Yep, it should be supported. Although I wouldn't imagine we have any regression testcases for that combination of features. My suspicion is around the proceed() method handling, I know it isn't perfect for annotation style so you are likely tripping over it and not being able to work out what it wants to be passed. Have you tried a code style aspect to see if that works just fine? (this would confirm that it is the annotation style proceed() method that is at fault). Raise a bugzilla for it. cheers, Andy On 14 January 2012 16:52, Arata Yamamoto <art...@gmail.com> wrote: > Hello, > > public interface KeySetKeyLockHandler { > // method signatures > } > > public static class KeySetKeyLockHandlerImpl implements > KeySetKeyLockHandler { > // contents of class > } > > @DeclareMixin( > value="slingong.web.gae.TransactionalMemcacheServiceImpl") > public static KeySetKeyLockHandler addKeySetKeyLockHandlerInterface( > Object instance) { > return new KeySetKeyLockHandlerImpl( > (TransactionalMemcacheServiceImpl)instance); > } > > @Around( value="execution( " > + "public * > slingong.web.gae.TransactionalMemcacheServiceBase+" > + ".setKeySetKey( java.lang.String)) " > + "&& this( keySetKeyLockHandler)" > ) > public Object aroundAdvisedSetKeySetKeyMethodExecution( > ProceedingJoinPoint proceedingJoinPoint, KeySetKeyLockHandler > keySetKeyLockHandler) { > > // Do some works on keySetKeyLockHandler > > // Invocation of actual target method > ------------------------------------------------- > try { > return proceedingJoinPoint.proceed( > proceedingJoinPoint.getArgs()); > } > catch( Throwable throwable) { > // Exception handling > } > // > ------------------------------------------------------------------------------------ > > // Do some works on keySetKeyLockHandler > } > > Note: > KeySetKeyLockHandler interface does not contain the definition of > the setKeySetKey method. > TransactionalMemcacheServiceImpl class is extended from > TransactionalMemcacheServiceBase abstract class > > I abbreviated the details from the actual code for easier readability. > > What I expected was that, of course, calling the proceed method in the code > snippet above executes setKeySetKey method of > TransactionalMemcacheServiceImpl instance. > However, it fails at that statement by the puzzling ClassCastException like: > slingong.web.gae.TransactionalMemcacheServiceException: > java.lang.ClassCastException: java.lang.String cannot be cast to > slingong.web.gae.TransactionalMemcacheServiceBase > at > slingong.web.gae.TransactionalMemcacheServiceBase.setKeySetKey_aroundBody1$advice(TransactionalMemcacheServiceBase.java:456) > at > slingong.web.gae.TransactionalMemcacheServiceBase.setKeySetKey_aroundBody2(TransactionalMemcacheServiceBase.java:1) > at > slingong.web.gae.TransactionalMemcacheServiceBase.setKeySetKey_aroundBody3$advice(TransactionalMemcacheServiceBase.java:578) > at > slingong.web.gae.TransactionalMemcacheServiceBase.setKeySetKey(TransactionalMemcacheServiceBase.java:132) > at > slingong.web.gae.TransactionalMemcacheServiceFactory.getInstance(TransactionalMemcacheServiceFactory.java:180) > at > slingong.web.gae.TransactionalMemcacheServiceFactoryTest.testGetInstance(TransactionalMemcacheServiceFactoryTest.java:93) > > As you may notice from the stack trace above, I have 2 around-advices > weaving at this join point, and as I said that I omitted the detail, that > exception may not be caused of the usage of @DeclareMixin & around advice > but from those omitted parts. However, I like to be sure about if it's > supported usage before digging deeper to find the cause, since I do not feel > so sure about calling ProceedingJoinPoint.proceed method after mixing even > though I assumed that it would be OK because I could not have found any > document to tell the restriction on such combination. > > I ran the test code under debugger and found that it fails at the statement > calling proceed method right after getArgs method returns before actually > running target setKeySetKey method. > Just before throwing the exception, proceedingJoinPoint appeared as below in > debugger (though I eliminated the info > on TransactionalMemcacheServiceImpl fields because I thought those would > just bloated lines of info without clue.) It appears to me that > the proceedingJoinPoint seems to be expected... > > proceedingJoinPoint JoinPointImpl (id=49) > _this TransactionalMemcacheServiceImpl (id=44) > > $SWITCH_TABLE$com$google$appengine$api$memcache$MemcacheService$SetPolicy > null > ajc$anno$0 null > > ajc$aspectjutil_eventmanager_EventListenerInstanceTracker$ptwAspectInstance > EventListenerInstanceTracker (id=55) > ajc$withinType > "slingong.web.gae.TransactionalMemcacheServiceBase" (id=106) > listenerMap WeakHashMap<K,V> (id=107) > > ajc$aspectjutil_eventmanager_EventListenerInstanceTracker$ptwAspectInstance > EventListenerInstanceTracker (id=72) > ajc$withinType > "slingong.web.gae.TransactionalMemcacheServiceImpl" (id=111) > listenerMap WeakHashMap<K,V> (id=112) > > ajc$instance$slingong_web_gae_TransactionalMemcacheServiceBaseThreadSyncAspect$slingong_web_gae_TransactionalMemcacheServiceBaseThreadSyncAspect$KeySetKeyLockHandler > TransactionalMemcacheServiceBaseThreadSyncAspect$KeySetKeyLockHandlerImpl > (id=73) > transactionalMemcacheServiceImpl > TransactionalMemcacheServiceImpl (id=44) > arc null > args Object[1] (id=101) > [0] "testGetInstance_keySetKey" (id=67) > staticPart JoinPointImpl$StaticPartImpl (id=103) > id 1 > kind "method-execution" (id=115) > count 16 > hash 0 > offset 0 > value (id=128) > signature MethodSignatureImpl (id=116) > EMPTY_CLASS_ARRAY Class<T>[0] (id=129) > EMPTY_STRING_ARRAY String[0] (id=131) > useCache true > declaringType Class<T> > (slingong.web.gae.TransactionalMemcacheServiceBase) (id=43) > declaringTypeName > "slingong.web.gae.TransactionalMemcacheServiceBase" (id=106) > exceptionTypes Class<T>[0] (id=137) > lookupClassLoader null > method null > modifiers 1 > name "setKeySetKey" (id=138) > parameterNames String[1] (id=139) > [0] "newKeysSetKey" (id=141) > parameterTypes Class<T>[1] (id=140) > [0] Class<T> (java.lang.String) (id=68) > returnType Class<T> (void) (id=142) > stringCache SignatureImpl$CacheImpl (id=143) > toStringCacheRef SoftReference<T> (id=149) > clock 1326542103609 > lock Reference$Lock (id=152) > pending null > discovered null > next null > queue ReferenceQueue$Null (id=154) > referent String[3] (id=157) > [0] "void > slingong.web.gae.TransactionalMemcacheServiceBase.setKeySetKey(String)" > (id=161) > [1] null > [2] null > timestamp 1326542103609 > stringRep null > sourceLocation SourceLocationImpl (id=118) > fileName "TransactionalMemcacheServiceBase.java" > (id=162) > line 130 > withinType Class<T> > (slingong.web.gae.TransactionalMemcacheServiceBase) (id=43) > target TransactionalMemcacheServiceImpl (id=44) > > Regards, > Art > > > _______________________________________________ > 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