Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] ReferenceType.isCoerceableFrom question

I suspect your problem is that EPR is an interface.

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

Suppose I wrote this (probably non-sensical but possible) code:

class Foo extends RequestTypeRegistry implements EPR {
}

Object o = new Foo().getRequestTypes();

Should it be advised?  Clearly it should as that is what you wrote in
the pointcut:

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

Although it is advised, you will see the '[with runtime test]' check
attached to the weaveinfo message, and I imagine if you looked in the
woven code you would see the runtime test is 'instanceof EPR' which
acts as a guard before the advise is called.  So the code will do what
you asked, but it can be worrying when it advises so many places like
this.

This is a well known gotcha with using an interface type as at runtime
the types flowing around could implement any old interface - so to do
the right thing we have to advised lots of places - but include
runtime checks to prevent advise running when it should not.

just a note: if RequestTypeRegistry was 'final' (and so could not be
subclassed), the get method would not be advised in this case.

Does it cause you a problem that the extra places are advised?

Andy.

2009/5/11 James Stangler <jastangler@xxxxxxxxx>:
> 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:
>
> [TomcatInstrumentableClassLoader@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]
> [TomcatInstrumentableClassLoader@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
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>


Back to the top