You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pa...@apache.org on 2017/04/07 07:18:00 UTC
wicket git commit: WICKET-6353: restrict number of reflection calls
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 <pa...@apache.org>
Authored: Fri Apr 7 09:17:48 2017 +0200
Committer: Emond Papegaaij <pa...@apache.org>
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);
}
}