@ -172,7 +172,7 @@ class CglibAopProxy implements AopProxy, Serializable {
@@ -172,7 +172,7 @@ class CglibAopProxy implements AopProxy, Serializable {
}
// Validate the class, writing log messages as necessary.
validateClassIfNecessary ( proxySuperClass ) ;
validateClassIfNecessary ( proxySuperClass , classLoader ) ;
// Configure CGLIB Enhancer...
Enhancer enhancer = createEnhancer ( ) ;
@ -239,11 +239,11 @@ class CglibAopProxy implements AopProxy, Serializable {
@@ -239,11 +239,11 @@ class CglibAopProxy implements AopProxy, Serializable {
* Checks to see whether the supplied { @code Class } has already been validated and
* validates it if not .
* /
private void validateClassIfNecessary ( Class < ? > proxySuperClass ) {
if ( logger . isWarn Enabled ( ) ) {
private void validateClassIfNecessary ( Class < ? > proxySuperClass , ClassLoader proxyClassLoader ) {
if ( logger . isInfo Enabled ( ) ) {
synchronized ( validatedClasses ) {
if ( ! validatedClasses . containsKey ( proxySuperClass ) ) {
doValidateClass ( proxySuperClass ) ;
doValidateClass ( proxySuperClass , proxyClassLoader ) ;
validatedClasses . put ( proxySuperClass , Boolean . TRUE ) ;
}
}
@ -251,19 +251,28 @@ class CglibAopProxy implements AopProxy, Serializable {
@@ -251,19 +251,28 @@ class CglibAopProxy implements AopProxy, Serializable {
}
/ * *
* Checks for final methods on the { @code Class } and writes warnings to the log
* for each one found .
* Checks for final methods on the given { @code Class } , as well as package - visible
* methods across ClassLoaders , and writes warnings to the log for each one found .
* /
private void doValidateClass ( Class < ? > proxySuperClass ) {
if ( logger . isWarnEnabled ( ) ) {
Method [ ] methods = proxySuperClass . getMethods ( ) ;
private void doValidateClass ( Class < ? > proxySuperClass , ClassLoader proxyClassLoader ) {
if ( ! Object . class . equals ( proxySuperClass ) ) {
Method [ ] methods = proxySuperClass . getDeclared Methods ( ) ;
for ( Method method : methods ) {
if ( ! Object . class . equals ( method . getDeclaringClass ( ) ) & & ! Modifier . isStatic ( method . getModifiers ( ) ) & &
Modifier . isFinal ( method . getModifiers ( ) ) ) {
logger . warn ( "Unable to proxy method [" + method + "] because it is final: " +
"All calls to this method via a proxy will be routed directly to the proxy." ) ;
int mod = method . getModifiers ( ) ;
if ( ! Modifier . isStatic ( mod ) ) {
if ( Modifier . isFinal ( mod ) ) {
logger . info ( "Unable to proxy method [" + method + "] because it is final: " +
"All calls to this method via a proxy will NOT be routed to the target instance." ) ;
}
else if ( ! Modifier . isPublic ( mod ) & & ! Modifier . isProtected ( mod ) & & ! Modifier . isPrivate ( mod ) & &
proxyClassLoader ! = null & & proxySuperClass . getClassLoader ( ) ! = proxyClassLoader ) {
logger . info ( "Unable to proxy method [" + method + "] because it is package-visible " +
"across different ClassLoaders: All calls to this method via a proxy will " +
"NOT be routed to the target instance." ) ;
}
}
}
doValidateClass ( proxySuperClass . getSuperclass ( ) , proxyClassLoader ) ;
}
}
@ -604,7 +613,7 @@ class CglibAopProxy implements AopProxy, Serializable {
@@ -604,7 +613,7 @@ class CglibAopProxy implements AopProxy, Serializable {
* /
private static class DynamicAdvisedInterceptor implements MethodInterceptor , Serializable {
private AdvisedSupport advised ;
private final AdvisedSupport advised ;
public DynamicAdvisedInterceptor ( AdvisedSupport advised ) {
this . advised = advised ;
@ -622,8 +631,8 @@ class CglibAopProxy implements AopProxy, Serializable {
@@ -622,8 +631,8 @@ class CglibAopProxy implements AopProxy, Serializable {
oldProxy = AopContext . setCurrentProxy ( proxy ) ;
setProxyContext = true ;
}
// May be null Get as late as possible to minimize the time we
// "own" the target, in case it comes from a pool.
// May be null. Get as late as possible to minimize the time we
// "own" the target, in case it comes from a pool...
target = getTarget ( ) ;
if ( target ! = null ) {
targetClass = target . getClass ( ) ;
@ -689,13 +698,13 @@ class CglibAopProxy implements AopProxy, Serializable {
@@ -689,13 +698,13 @@ class CglibAopProxy implements AopProxy, Serializable {
private final MethodProxy methodProxy ;
private boolean protected Method;
private final boolean public Method;
public CglibMethodInvocation ( Object proxy , Object target , Method method , Object [ ] arguments ,
Class < ? > targetClass , List < Object > interceptorsAndDynamicMethodMatchers , MethodProxy methodProxy ) {
super ( proxy , target , method , arguments , targetClass , interceptorsAndDynamicMethodMatchers ) ;
this . methodProxy = methodProxy ;
this . protected Method = Modifier . isProtected ( method . getModifiers ( ) ) ;
this . public Method = Modifier . isPublic ( method . getModifiers ( ) ) ;
}
/ * *
@ -704,11 +713,11 @@ class CglibAopProxy implements AopProxy, Serializable {
@@ -704,11 +713,11 @@ class CglibAopProxy implements AopProxy, Serializable {
* /
@Override
protected Object invokeJoinpoint ( ) throws Throwable {
if ( this . protected Method ) {
return super . invokeJoinpoint ( ) ;
if ( this . public Method ) {
return this . methodProxy . invoke ( this . target , this . arguments ) ;
}
else {
return this . methodProxy . invoke ( this . target , this . arguments ) ;
return super . invokeJoinpoint ( ) ;
}
}
}
@ -829,8 +838,8 @@ class CglibAopProxy implements AopProxy, Serializable {
@@ -829,8 +838,8 @@ class CglibAopProxy implements AopProxy, Serializable {
// of the target type. If so we know it never needs to have return type
// massage and can use a dispatcher.
// If the proxy is being exposed, then must use the interceptor the
// correct one is already configured. If the target is not static cannot
// use a Dispatcher because the target can not then be released.
// correct one is already configured. If the target is not static, then
// cannot use a dispatcher because the target cannot be released.
if ( exposeProxy | | ! isStatic ) {
return INVOKE_TARGET ;
}