Example usage for org.aspectj.weaver.reflect ShadowMatchImpl ShadowMatchImpl

List of usage examples for org.aspectj.weaver.reflect ShadowMatchImpl ShadowMatchImpl

Introduction

In this page you can find the example usage for org.aspectj.weaver.reflect ShadowMatchImpl ShadowMatchImpl.

Prototype

public ShadowMatchImpl(FuzzyBoolean match, Test test, ExposedState state, PointcutParameter[] params) 

Source Link

Usage

From source file:org.springframework.aop.aspectj.AspectJExpressionPointcut.java

License:Apache License

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 {
                    shadowMatch = this.pointcutExpression.matchesMethodExecution(methodToMatch);
                } catch (ReflectionWorldException ex) {
                    // Failed to introspect target method, probably because it has been loaded
                    // in a special ClassLoader. Let's try the declaring ClassLoader instead...
                    try {
                        fallbackExpression = getFallbackPointcutExpression(methodToMatch.getDeclaringClass());
                        if (fallbackExpression != null) {
                            shadowMatch = fallbackExpression.matchesMethodExecution(methodToMatch);
                        }//from   ww  w  . j a  v a  2s .co m
                    } catch (ReflectionWorldException ex2) {
                        fallbackExpression = null;
                    }
                }
                if (shadowMatch == null && targetMethod != originalMethod) {
                    methodToMatch = originalMethod;
                    try {
                        shadowMatch = this.pointcutExpression.matchesMethodExecution(methodToMatch);
                    } catch (ReflectionWorldException ex3) {
                        // Could neither introspect the target class nor the proxy class ->
                        // 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;
                        }
                    }
                }
                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;
}