|
|
|
@ -1,5 +1,5 @@ |
|
|
|
/* |
|
|
|
/* |
|
|
|
* Copyright 2002-2009 the original author or authors. |
|
|
|
* Copyright 2002-2010 the original author or authors. |
|
|
|
* |
|
|
|
* |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
@ -85,7 +85,7 @@ public abstract class AopUtils { |
|
|
|
* Check whether the specified class is a CGLIB-generated class. |
|
|
|
* Check whether the specified class is a CGLIB-generated class. |
|
|
|
* @param clazz the class to check |
|
|
|
* @param clazz the class to check |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public static boolean isCglibProxyClass(Class clazz) { |
|
|
|
public static boolean isCglibProxyClass(Class<?> clazz) { |
|
|
|
return (clazz != null && isCglibProxyClassName(clazz.getName())); |
|
|
|
return (clazz != null && isCglibProxyClassName(clazz.getName())); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -102,18 +102,20 @@ public abstract class AopUtils { |
|
|
|
* which might be an AOP proxy. |
|
|
|
* which might be an AOP proxy. |
|
|
|
* <p>Returns the target class for an AOP proxy and the plain class else. |
|
|
|
* <p>Returns the target class for an AOP proxy and the plain class else. |
|
|
|
* @param candidate the instance to check (might be an AOP proxy) |
|
|
|
* @param candidate the instance to check (might be an AOP proxy) |
|
|
|
* @return the target class (or the plain class of the given object as fallback) |
|
|
|
* @return the target class (or the plain class of the given object as fallback; |
|
|
|
|
|
|
|
* never <code>null</code>) |
|
|
|
* @see org.springframework.aop.TargetClassAware#getTargetClass() |
|
|
|
* @see org.springframework.aop.TargetClassAware#getTargetClass() |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public static Class getTargetClass(Object candidate) { |
|
|
|
public static Class<?> getTargetClass(Object candidate) { |
|
|
|
Assert.notNull(candidate, "Candidate object must not be null"); |
|
|
|
Assert.notNull(candidate, "Candidate object must not be null"); |
|
|
|
|
|
|
|
Class<?> result = null; |
|
|
|
if (candidate instanceof TargetClassAware) { |
|
|
|
if (candidate instanceof TargetClassAware) { |
|
|
|
return ((TargetClassAware) candidate).getTargetClass(); |
|
|
|
result = ((TargetClassAware) candidate).getTargetClass(); |
|
|
|
} |
|
|
|
} |
|
|
|
if (isCglibProxy(candidate)) { |
|
|
|
if (result == null) { |
|
|
|
return candidate.getClass().getSuperclass(); |
|
|
|
result = (isCglibProxy(candidate) ? candidate.getClass().getSuperclass() : candidate.getClass()); |
|
|
|
} |
|
|
|
} |
|
|
|
return candidate.getClass(); |
|
|
|
return result; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
@ -165,7 +167,7 @@ public abstract class AopUtils { |
|
|
|
* <code>targetClass</code> doesn't implement it or is <code>null</code> |
|
|
|
* <code>targetClass</code> doesn't implement it or is <code>null</code> |
|
|
|
* @see org.springframework.util.ClassUtils#getMostSpecificMethod |
|
|
|
* @see org.springframework.util.ClassUtils#getMostSpecificMethod |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public static Method getMostSpecificMethod(Method method, Class targetClass) { |
|
|
|
public static Method getMostSpecificMethod(Method method, Class<?> targetClass) { |
|
|
|
Method resolvedMethod = ClassUtils.getMostSpecificMethod(method, targetClass); |
|
|
|
Method resolvedMethod = ClassUtils.getMostSpecificMethod(method, targetClass); |
|
|
|
// If we are dealing with method with generic parameters, find the original method.
|
|
|
|
// If we are dealing with method with generic parameters, find the original method.
|
|
|
|
return BridgeMethodResolver.findBridgedMethod(resolvedMethod); |
|
|
|
return BridgeMethodResolver.findBridgedMethod(resolvedMethod); |
|
|
|
@ -180,7 +182,7 @@ public abstract class AopUtils { |
|
|
|
* @param targetClass the class to test |
|
|
|
* @param targetClass the class to test |
|
|
|
* @return whether the pointcut can apply on any method |
|
|
|
* @return whether the pointcut can apply on any method |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public static boolean canApply(Pointcut pc, Class targetClass) { |
|
|
|
public static boolean canApply(Pointcut pc, Class<?> targetClass) { |
|
|
|
return canApply(pc, targetClass, false); |
|
|
|
return canApply(pc, targetClass, false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -194,7 +196,7 @@ public abstract class AopUtils { |
|
|
|
* for this bean includes any introductions |
|
|
|
* for this bean includes any introductions |
|
|
|
* @return whether the pointcut can apply on any method |
|
|
|
* @return whether the pointcut can apply on any method |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public static boolean canApply(Pointcut pc, Class targetClass, boolean hasIntroductions) { |
|
|
|
public static boolean canApply(Pointcut pc, Class<?> targetClass, boolean hasIntroductions) { |
|
|
|
if (!pc.getClassFilter().matches(targetClass)) { |
|
|
|
if (!pc.getClassFilter().matches(targetClass)) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -207,7 +209,7 @@ public abstract class AopUtils { |
|
|
|
|
|
|
|
|
|
|
|
Set<Class> classes = new HashSet<Class>(ClassUtils.getAllInterfacesForClassAsSet(targetClass)); |
|
|
|
Set<Class> classes = new HashSet<Class>(ClassUtils.getAllInterfacesForClassAsSet(targetClass)); |
|
|
|
classes.add(targetClass); |
|
|
|
classes.add(targetClass); |
|
|
|
for (Class clazz : classes) { |
|
|
|
for (Class<?> clazz : classes) { |
|
|
|
Method[] methods = clazz.getMethods(); |
|
|
|
Method[] methods = clazz.getMethods(); |
|
|
|
for (Method method : methods) { |
|
|
|
for (Method method : methods) { |
|
|
|
if ((introductionAwareMethodMatcher != null && |
|
|
|
if ((introductionAwareMethodMatcher != null && |
|
|
|
@ -229,7 +231,7 @@ public abstract class AopUtils { |
|
|
|
* @param targetClass class we're testing |
|
|
|
* @param targetClass class we're testing |
|
|
|
* @return whether the pointcut can apply on any method |
|
|
|
* @return whether the pointcut can apply on any method |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public static boolean canApply(Advisor advisor, Class targetClass) { |
|
|
|
public static boolean canApply(Advisor advisor, Class<?> targetClass) { |
|
|
|
return canApply(advisor, targetClass, false); |
|
|
|
return canApply(advisor, targetClass, false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -243,7 +245,7 @@ public abstract class AopUtils { |
|
|
|
* any introductions |
|
|
|
* any introductions |
|
|
|
* @return whether the pointcut can apply on any method |
|
|
|
* @return whether the pointcut can apply on any method |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public static boolean canApply(Advisor advisor, Class targetClass, boolean hasIntroductions) { |
|
|
|
public static boolean canApply(Advisor advisor, Class<?> targetClass, boolean hasIntroductions) { |
|
|
|
if (advisor instanceof IntroductionAdvisor) { |
|
|
|
if (advisor instanceof IntroductionAdvisor) { |
|
|
|
return ((IntroductionAdvisor) advisor).getClassFilter().matches(targetClass); |
|
|
|
return ((IntroductionAdvisor) advisor).getClassFilter().matches(targetClass); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -265,7 +267,7 @@ public abstract class AopUtils { |
|
|
|
* @return sublist of Advisors that can apply to an object of the given class
|
|
|
|
* @return sublist of Advisors that can apply to an object of the given class
|
|
|
|
* (may be the incoming List as-is) |
|
|
|
* (may be the incoming List as-is) |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public static List<Advisor> findAdvisorsThatCanApply(List<Advisor> candidateAdvisors, Class clazz) { |
|
|
|
public static List<Advisor> findAdvisorsThatCanApply(List<Advisor> candidateAdvisors, Class<?> clazz) { |
|
|
|
if (candidateAdvisors.isEmpty()) { |
|
|
|
if (candidateAdvisors.isEmpty()) { |
|
|
|
return candidateAdvisors; |
|
|
|
return candidateAdvisors; |
|
|
|
} |
|
|
|
} |
|
|
|
|