[FLINK-1817] Fix ClassLoaderObjectInputStream to support primitive type classes
This closes #565 Project: http://git-wip-us.apache.org/repos/asf/flink/repo Commit: http://git-wip-us.apache.org/repos/asf/flink/commit/d33b4454 Tree: http://git-wip-us.apache.org/repos/asf/flink/tree/d33b4454 Diff: http://git-wip-us.apache.org/repos/asf/flink/diff/d33b4454 Branch: refs/heads/master Commit: d33b44549d416c30f01ead9aacf5cf7ed30674ca Parents: 23fe006 Author: Fabian Hueske <fhue...@apache.org> Authored: Thu Apr 2 01:28:08 2015 +0200 Committer: Fabian Hueske <fhue...@apache.org> Committed: Tue Apr 7 14:46:24 2015 +0200 ---------------------------------------------------------------------- .../apache/flink/util/InstantiationUtil.java | 30 +++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flink/blob/d33b4454/flink-core/src/main/java/org/apache/flink/util/InstantiationUtil.java ---------------------------------------------------------------------- diff --git a/flink-core/src/main/java/org/apache/flink/util/InstantiationUtil.java b/flink-core/src/main/java/org/apache/flink/util/InstantiationUtil.java index c7088f5..241e56a 100644 --- a/flink-core/src/main/java/org/apache/flink/util/InstantiationUtil.java +++ b/flink-core/src/main/java/org/apache/flink/util/InstantiationUtil.java @@ -34,6 +34,7 @@ import java.io.ObjectOutputStream; import java.io.ObjectStreamClass; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; +import java.util.HashMap; /** * Utility class to create instances from class objects and checking failure reasons. @@ -48,10 +49,37 @@ public class InstantiationUtil { private static class ClassLoaderObjectInputStream extends ObjectInputStream { private ClassLoader classLoader; + private static final HashMap<String, Class<?>> primitiveClasses + = new HashMap<String, Class<?>>(8, 1.0F); + static { + primitiveClasses.put("boolean", boolean.class); + primitiveClasses.put("byte", byte.class); + primitiveClasses.put("char", char.class); + primitiveClasses.put("short", short.class); + primitiveClasses.put("int", int.class); + primitiveClasses.put("long", long.class); + primitiveClasses.put("float", float.class); + primitiveClasses.put("double", double.class); + primitiveClasses.put("void", void.class); + } + @Override public Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { if (classLoader != null) { - return Class.forName(desc.getName(), false, classLoader); + String name = desc.getName(); + try { + return Class.forName(name, false, classLoader); + } catch (ClassNotFoundException ex) { + // check if class is a primitive class + Class<?> cl = primitiveClasses.get(name); + if (cl != null) { + // return primitive class + return cl; + } else { + // throw ClassNotFoundException + throw ex; + } + } } return super.resolveClass(desc);