I hope someone can help me understand what's going wrong (or let me know what 
additional information I need to provide).  I have an aspect where the pointcut 
seems to be advising code that it shouldn't be advising and it seems to be 
getting the ok from the isCoerceableFrom method in ReferenceType.  I'm using 
aspectJ 1.6.4 with LTW.

My aspect is defined with:

   @Pointcut("(execution (* *.get*()) && this(com.sabre.liberty.user.EPR))")

   @Pointcut("(execution (* *.is*()) && this(com.sabre.liberty.user.EPR))")

   @Around(value = "monitorEprGetMethod() || monitorEprIsMethod()")

The pointcut should only be applied to instances of 
"com.sabre.liberty.user.EPR" and its subclasses.  Unfortunately it seems to be 
getting applied to almost any getter such as:

[tomcatinstrumentableclassloa...@18346a3] weaveinfo Join point 
'method-execution(java.util.List 
com.sabre.liberty.web.RequestTypeRegistry.getRequestTypes())' in Type 
'com.sabre.liberty.web.RequestTypeRegistry' (RequestTypeRegistry.java:54) 
advised by around advice from 
'com.sabre.liberty.modules.util.greenbeans.IceDebugAspect' 
(IceDebugAspect.java) [with runtime test]
[tomcatinstrumentableclassloa...@18346a3] weaveinfo Join point 
'method-execution(java.lang.Object 
com.sabre.liberty.web.RequestTypeRegistry.getDefaultRequestType())' in Type 
'com.sabre.liberty.web.RequestTypeRegistry' (RequestTypeRegistry.java:58) 
advised by around advice from 
'com.sabre.liberty.modules.util.greenbeans.IceDebugAspect' 
(IceDebugAspect.java) [with runtime test]

The class "com.sabre.liberty.web.RequestTypeRegistry" extends Object and 
implements no interfaces.  The interface "com.sabre.liberty.user.EPR" extends 
no other interfaces.

It appears that the method ReferenceType.isCoerceableFrom is the one that 
allows the methods to be advised.  The command in the method isCoerceableFrom 
has the comment "true iff the statement "this = (ThisType) other" would 
compile" which would never be the case since none of the methods overlap (I 
guess a subclass could implement the interface and define the methods, but the 
advice would always be applied to the subclass and never this class).  Why 
would this method decide that one was coerceable to the other?  The stacktrace 
below was while seeing if the advice "@Around(value = "monitorEprGetMethod() || 
monitorEprIsMethod()")" should be applied to 
"com.sabre.liberty.web.RequestTypeRegistry.getRequestTypes()".  The method 
returns true.

Thread [main] (Suspended)    
    ReferenceType.isCoerceableFrom(ResolvedType) line: 298    
    ExactTypePattern.matchesInstanceof(ResolvedType) line: 177    
    ExactTypePattern(TypePattern).matches(ResolvedType, TypePattern$MatchKind) 
line: 150    
    ThisOrTargetPointcut.matchInternal(Shadow) line: 113    
    ThisOrTargetPointcut(Pointcut).match(Shadow) line: 146    
    AndPointcut.matchInternal(Shadow) line: 54    
    AndPointcut(Pointcut).match(Shadow) line: 146    
    AndPointcut.matchInternal(Shadow) line: 52    
    AndPointcut(Pointcut).match(Shadow) line: 146    
    OrPointcut.matchInternal(Shadow) line: 53    
    OrPointcut(Pointcut).match(Shadow) line: 146    
    BcelAdvice(ShadowMunger).match(Shadow, World) line: 79    
    BcelAdvice(Advice).match(Shadow, World) line: 112    
    BcelAdvice.match(Shadow, World) line: 145    
    BcelClassWeaver.match(BcelShadow, List) line: 3025    
    BcelClassWeaver.match(LazyMethodGen) line: 2499    
    BcelClassWeaver.weave() line: 480    
    BcelClassWeaver.weave(BcelWorld, LazyClassGen, List, List, List, boolean) 
line: 103    
    BcelWeaver.weave(UnwovenClassFile, BcelObjectType, boolean) line: 1735    
    BcelWeaver.weaveWithoutDump(UnwovenClassFile, BcelObjectType) line: 1696    
    BcelWeaver.weaveAndNotify(UnwovenClassFile, BcelObjectType, 
IWeaveRequestor) line: 1458    
    BcelWeaver.weave(IClassFileProvider) line: 1272    
    ClassLoaderWeavingAdaptor(WeavingAdaptor).getWovenBytes(String, byte[]) 
line: 423    
    ClassLoaderWeavingAdaptor(WeavingAdaptor).weaveClass(String, byte[], 
boolean) line: 286    
    Aj.preProcess(String, byte[], ClassLoader) line: 95    
    ClassPreProcessorAgentAdapter.transform(ClassLoader, String, Class<?>, 
ProtectionDomain, byte[]) line: 52    
    
AspectJWeavingEnabler$AspectJClassBypassingClassFileTransformer.transform(ClassLoader,
 String, Class<?>, ProtectionDomain, byte[]) line: 92    
    
InstrumentationLoadTimeWeaver$FilteringClassFileTransformer.transform(ClassLoader,
 String, Class<?>, ProtectionDomain, byte[]) line: 181    
    TransformerManager.transform(ClassLoader, String, Class, ProtectionDomain, 
byte[]) line: not available    
    InstrumentationImpl.transform(ClassLoader, String, Class, ProtectionDomain, 
byte[], boolean) line: not available    
    ClassLoader.defineClass1(String, byte[], int, int, ProtectionDomain, 
String) line: not available [native method]    
    TomcatInstrumentableClassLoader(ClassLoader).defineClass(String, byte[], 
int, int, ProtectionDomain) line: not available    
    TomcatInstrumentableClassLoader(SecureClassLoader).defineClass(String, 
byte[], int, int, CodeSource) line: not available    
<snip>


      
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to