Browse Source

Defensively catch IllegalStateException from match attempts (for compatibility with AspectJ 1.8.10)

Issue: SPR-15019
(cherry picked from commit 3370f41)
pull/1290/head
Juergen Hoeller 9 years ago
parent
commit
f0c3d50408
  1. 53
      spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJExpressionPointcut.java

53
spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJExpressionPointcut.java

@ -261,6 +261,10 @@ public class AspectJExpressionPointcut extends AbstractExpressionPointcut
catch (BCException ex) { catch (BCException ex) {
logger.debug("PointcutExpression matching rejected target class", ex); logger.debug("PointcutExpression matching rejected target class", ex);
} }
catch (IllegalStateException ex) {
// AspectJ 1.8.10: encountered invalid signature
logger.debug("PointcutExpression matching rejected target class", ex);
}
return false; return false;
} }
@ -413,39 +417,46 @@ public class AspectJExpressionPointcut extends AbstractExpressionPointcut
shadowMatch = this.shadowMatchCache.get(targetMethod); shadowMatch = this.shadowMatchCache.get(targetMethod);
if (shadowMatch == null) { if (shadowMatch == null) {
try { 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);
}
}
catch (ReflectionWorldException ex2) {
fallbackExpression = null;
}
}
if (shadowMatch == null && targetMethod != originalMethod) {
methodToMatch = originalMethod;
try { try {
shadowMatch = this.pointcutExpression.matchesMethodExecution(methodToMatch); shadowMatch = this.pointcutExpression.matchesMethodExecution(methodToMatch);
} }
catch (ReflectionWorldException ex3) { catch (ReflectionWorldException ex) {
// Could neither introspect the target class nor the proxy class -> // Failed to introspect target method, probably because it has been loaded
// let's try the original method's declaring class before we give up... // in a special ClassLoader. Let's try the declaring ClassLoader instead...
try { try {
fallbackExpression = getFallbackPointcutExpression(methodToMatch.getDeclaringClass()); fallbackExpression = getFallbackPointcutExpression(methodToMatch.getDeclaringClass());
if (fallbackExpression != null) { if (fallbackExpression != null) {
shadowMatch = fallbackExpression.matchesMethodExecution(methodToMatch); shadowMatch = fallbackExpression.matchesMethodExecution(methodToMatch);
} }
} }
catch (ReflectionWorldException ex4) { catch (ReflectionWorldException ex2) {
fallbackExpression = null; 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;
}
}
}
}
catch (IllegalStateException ex) {
// AspectJ 1.8.10: encountered invalid signature
logger.debug("PointcutExpression matching rejected target method", ex);
fallbackExpression = null;
} }
if (shadowMatch == null) { if (shadowMatch == null) {
shadowMatch = new ShadowMatchImpl(org.aspectj.util.FuzzyBoolean.NO, null, null, null); shadowMatch = new ShadowMatchImpl(org.aspectj.util.FuzzyBoolean.NO, null, null, null);

Loading…
Cancel
Save