Search in sources :

Example 1 with ShadowMatchImpl

use of org.aspectj.weaver.reflect.ShadowMatchImpl in project spring-framework by spring-projects.

the class AspectJExpressionPointcut method getShadowMatch.

private ShadowMatch getShadowMatch(Method targetMethod, Method originalMethod) {
    // Avoid lock contention for known Methods through concurrent access...
    ShadowMatch shadowMatch = this.shadowMatchCache.get(targetMethod);
    if (shadowMatch == null) {
        synchronized (this.shadowMatchCache) {
            // Not found - now check again with full lock...
            PointcutExpression fallbackExpression = null;
            Method methodToMatch = targetMethod;
            shadowMatch = this.shadowMatchCache.get(targetMethod);
            if (shadowMatch == null) {
                try {
                    try {
                        shadowMatch = this.pointcutExpression.matchesMethodExecution(methodToMatch);
                    } catch (ReflectionWorldException ex) {
                        // in a special ClassLoader. Let's try the declaring ClassLoader instead...
                        try {
                            fallbackExpression = getFallbackPointcutExpression(methodToMatch.getDeclaringClass());
                            if (fallbackExpression != null) {
                                shadowMatch = fallbackExpression.matchesMethodExecution(methodToMatch);
                            }
                        } catch (ReflectionWorldException ex2) {
                            fallbackExpression = null;
                        }
                    }
                    if (shadowMatch == null && targetMethod != originalMethod) {
                        methodToMatch = originalMethod;
                        try {
                            shadowMatch = this.pointcutExpression.matchesMethodExecution(methodToMatch);
                        } catch (ReflectionWorldException ex3) {
                            // let's try the original method's declaring class before we give up...
                            try {
                                fallbackExpression = getFallbackPointcutExpression(methodToMatch.getDeclaringClass());
                                if (fallbackExpression != null) {
                                    shadowMatch = fallbackExpression.matchesMethodExecution(methodToMatch);
                                }
                            } catch (ReflectionWorldException ex4) {
                                fallbackExpression = null;
                            }
                        }
                    }
                } catch (Throwable ex) {
                    // Possibly AspectJ 1.8.10 encountering an invalid signature
                    logger.debug("PointcutExpression matching rejected target method", ex);
                    fallbackExpression = null;
                }
                if (shadowMatch == null) {
                    shadowMatch = new ShadowMatchImpl(org.aspectj.util.FuzzyBoolean.NO, null, null, null);
                } else if (shadowMatch.maybeMatches() && fallbackExpression != null) {
                    shadowMatch = new DefensiveShadowMatch(shadowMatch, fallbackExpression.matchesMethodExecution(methodToMatch));
                }
                this.shadowMatchCache.put(targetMethod, shadowMatch);
            }
        }
    }
    return shadowMatch;
}
Also used : PointcutExpression(org.aspectj.weaver.tools.PointcutExpression) ShadowMatch(org.aspectj.weaver.tools.ShadowMatch) Method(java.lang.reflect.Method) ReflectionWorldException(org.aspectj.weaver.reflect.ReflectionWorld.ReflectionWorldException) ShadowMatchImpl(org.aspectj.weaver.reflect.ShadowMatchImpl)

Aggregations

Method (java.lang.reflect.Method)1 ReflectionWorldException (org.aspectj.weaver.reflect.ReflectionWorld.ReflectionWorldException)1 ShadowMatchImpl (org.aspectj.weaver.reflect.ShadowMatchImpl)1 PointcutExpression (org.aspectj.weaver.tools.PointcutExpression)1 ShadowMatch (org.aspectj.weaver.tools.ShadowMatch)1