AspectJExpressionPointcut leniently ignores non-composable interfaces
Issue: SPR-17003
(cherry picked from commit bccff73)
This commit is contained in:
@@ -434,9 +434,15 @@ public class AspectJExpressionPointcut extends AbstractExpressionPointcut
|
||||
// Note: AspectJ is only going to take Method.getDeclaringClass() into account.
|
||||
Set<Class<?>> ifcs = ClassUtils.getAllInterfacesForClassAsSet(targetClass);
|
||||
if (ifcs.size() > 1) {
|
||||
Class<?> compositeInterface = ClassUtils.createCompositeInterface(
|
||||
ClassUtils.toClassArray(ifcs), targetClass.getClassLoader());
|
||||
targetMethod = ClassUtils.getMostSpecificMethod(targetMethod, compositeInterface);
|
||||
try {
|
||||
Class<?> compositeInterface = ClassUtils.createCompositeInterface(
|
||||
ClassUtils.toClassArray(ifcs), targetClass.getClassLoader());
|
||||
targetMethod = ClassUtils.getMostSpecificMethod(targetMethod, compositeInterface);
|
||||
}
|
||||
catch (IllegalArgumentException ex) {
|
||||
// Implemented interfaces probably expose conflicting method signatures...
|
||||
// Proceed with original target method.
|
||||
}
|
||||
}
|
||||
}
|
||||
return getShadowMatch(targetMethod, method);
|
||||
@@ -561,6 +567,19 @@ public class AspectJExpressionPointcut extends AbstractExpressionPointcut
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Serialization support
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
|
||||
// Rely on default serialization, just initialize state after deserialization.
|
||||
ois.defaultReadObject();
|
||||
|
||||
// Initialize transient fields.
|
||||
// pointcutExpression will be initialized lazily by checkReadyToMatch()
|
||||
this.shadowMatchCache = new ConcurrentHashMap<>(32);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Handler for the Spring-specific {@code bean()} pointcut designator
|
||||
@@ -657,20 +676,6 @@ public class AspectJExpressionPointcut extends AbstractExpressionPointcut
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Serialization support
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
|
||||
// Rely on default serialization, just initialize state after deserialization.
|
||||
ois.defaultReadObject();
|
||||
|
||||
// Initialize transient fields.
|
||||
// pointcutExpression will be initialized lazily by checkReadyToMatch()
|
||||
this.shadowMatchCache = new ConcurrentHashMap<>(32);
|
||||
}
|
||||
|
||||
|
||||
private static class DefensiveShadowMatch implements ShadowMatch {
|
||||
|
||||
private final ShadowMatch primary;
|
||||
|
||||
@@ -754,6 +754,8 @@ public abstract class ClassUtils {
|
||||
* @param interfaces the interfaces to merge
|
||||
* @param classLoader the ClassLoader to create the composite Class in
|
||||
* @return the merged interface as Class
|
||||
* @throws IllegalArgumentException if the specified interfaces expose
|
||||
* conflicting method signatures (or a similar constraint is violated)
|
||||
* @see java.lang.reflect.Proxy#getProxyClass
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
|
||||
Reference in New Issue
Block a user