Repository: wicket Updated Branches: refs/heads/classloadingfix bdc9e66c2 -> 4b2718346
WICKET-6353: restrict number of reflection calls Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/4b271834 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/4b271834 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/4b271834 Branch: refs/heads/classloadingfix Commit: 4b2718346c84520f197c0514c9c29320423a8b07 Parents: bdc9e66 Author: Emond Papegaaij <[email protected]> Authored: Fri Apr 7 09:17:48 2017 +0200 Committer: Emond Papegaaij <[email protected]> Committed: Fri Apr 7 09:17:48 2017 +0200 ---------------------------------------------------------------------- .../wicket/serialize/java/JavaSerializer.java | 83 +++++++++++--------- 1 file changed, 48 insertions(+), 35 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/4b271834/wicket-core/src/main/java/org/apache/wicket/serialize/java/JavaSerializer.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/serialize/java/JavaSerializer.java b/wicket-core/src/main/java/org/apache/wicket/serialize/java/JavaSerializer.java index 1e4a8be..0767f1c 100644 --- a/wicket-core/src/main/java/org/apache/wicket/serialize/java/JavaSerializer.java +++ b/wicket-core/src/main/java/org/apache/wicket/serialize/java/JavaSerializer.java @@ -215,15 +215,16 @@ public class JavaSerializer implements ISerializer * resolves a class by name, first using the default Class.forName, but looking in the * Wicket ClassResolvers as well. */ - private Class< ? > resolveClassByName(String className) throws ClassNotFoundException + private Class<?> resolveClassByName(String className, ClassLoader latestUserDefined) + throws ClassNotFoundException { try { - return Class.forName(className, false, latestUserDefinedLoader()); + return Class.forName(className, false, latestUserDefined); } catch (ClassNotFoundException cnfEx) { - Class< ? > ret = resolveClassInWicket(className); + Class<?> ret = resolveClassInWicket(className); if (ret == null) throw cnfEx; return ret; @@ -233,9 +234,9 @@ public class JavaSerializer implements ISerializer /* * Resolves a class from Wicket's ClassResolver */ - private Class< ? > resolveClassInWicket(String className) throws ClassNotFoundException + private Class<?> resolveClassInWicket(String className) throws ClassNotFoundException { - Class< ? > candidate; + Class<?> candidate; try { Application application = Application.get(); @@ -248,7 +249,7 @@ public class JavaSerializer implements ISerializer { if (ex.getCause() instanceof ClassNotFoundException) { - throw (ClassNotFoundException) ex.getCause(); + throw (ClassNotFoundException)ex.getCause(); } else { @@ -265,43 +266,55 @@ public class JavaSerializer implements ISerializer * resolveClassByName. */ @Override - protected Class< ? > resolveProxyClass(String[] interfaces) throws ClassNotFoundException + protected Class<?> resolveProxyClass(String[] interfaces) + throws ClassNotFoundException, IOException { - ClassLoader latestLoader = latestUserDefinedLoader(); - ClassLoader nonPublicLoader = null; - boolean hasNonPublicInterface = false; - - // define proxy in class loader of non-public interface(s), if any - Class< ? >[] classObjs = new Class< ? >[interfaces.length]; - for (int i = 0; i < interfaces.length; i++) + try + { + return super.resolveProxyClass(interfaces); + } + catch (ClassNotFoundException cnfEx) { - Class< ? > cl = resolveClassByName(interfaces[i]); - if ((cl.getModifiers() & Modifier.PUBLIC) == 0) + // ignore this exception. + log.debug( + "Proxy Class not found by the object outputstream itself, trying the IClassResolver"); + + ClassLoader latestLoader = latestUserDefinedLoader(); + ClassLoader nonPublicLoader = null; + boolean hasNonPublicInterface = false; + + // define proxy in class loader of non-public interface(s), if any + Class<?>[] classObjs = new Class<?>[interfaces.length]; + for (int i = 0; i < interfaces.length; i++) { - if (hasNonPublicInterface) + Class<?> cl = resolveClassByName(interfaces[i], latestLoader); + if ((cl.getModifiers() & Modifier.PUBLIC) == 0) { - if (nonPublicLoader != cl.getClassLoader()) + if (hasNonPublicInterface) { - throw new IllegalAccessError( - "conflicting non-public interface class loaders"); + if (nonPublicLoader != cl.getClassLoader()) + { + throw new IllegalAccessError( + "conflicting non-public interface class loaders"); + } + } + else + { + nonPublicLoader = cl.getClassLoader(); + hasNonPublicInterface = true; } } - else - { - nonPublicLoader = cl.getClassLoader(); - hasNonPublicInterface = true; - } + classObjs[i] = cl; + } + try + { + return Proxy.getProxyClass( + hasNonPublicInterface ? nonPublicLoader : latestLoader, classObjs); + } + catch (IllegalArgumentException e) + { + throw new ClassNotFoundException(null, e); } - classObjs[i] = cl; - } - try - { - return Proxy.getProxyClass(hasNonPublicInterface ? nonPublicLoader : latestLoader, - classObjs); - } - catch (IllegalArgumentException e) - { - throw new ClassNotFoundException(null, e); } }
