This is an automated email from the ASF dual-hosted git repository.

nizhikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new e58ce26400d IGNITE-28946 Apply class name filter always (#13436)
e58ce26400d is described below

commit e58ce26400d062070a2ac99bfb9fb639fd368955
Author: Nikolay <[email protected]>
AuthorDate: Thu Aug 6 14:48:16 2026 +0300

    IGNITE-28946 Apply class name filter always (#13436)
---
 .../ignite/internal/binary/BinaryContext.java      |   9 +-
 .../apache/ignite/internal/binary/BinaryUtils.java |  15 +-
 .../internal/marshaller/ClassLoaderUtils.java      | 209 +++++++++++++++++++++
 .../ignite/internal/binary/BinaryReaderExImpl.java |   6 +-
 .../internal/binary/builder/BinaryBuilderEnum.java |   5 +-
 .../binary/builder/BinaryEnumArrayLazyValue.java   |   5 +-
 .../binary/builder/BinaryObjectArrayLazyValue.java |   5 +-
 .../binary/builder/BinaryObjectBuilderImpl.java    |   4 +-
 .../optimized/OptimizedMarshallerImpl.java         |  26 +--
 .../optimized/OptimizedMarshallerUtils.java        |   4 +-
 .../optimized/OptimizedObjectInputStream.java      |  14 +-
 .../jdk/JdkMarshallerObjectInputStream.java        |   6 +-
 .../query/calcite/externalize/RelJson.java         |   4 +-
 .../apache/ignite/internal/util/CommonUtils.java   | 188 ++----------------
 .../ignite/internal/IgniteComponentType.java       |   3 +-
 .../org/apache/ignite/internal/IgniteKernal.java   |   3 +-
 .../ignite/internal/MarshallerContextImpl.java     |   3 +-
 .../internal/jdbc/thin/JdbcThinConnection.java     |   3 +-
 .../managers/deployment/GridDeployment.java        |   5 +-
 .../deployment/GridDeploymentLocalStore.java       |   3 +-
 .../deployment/GridDeploymentPerVersionStore.java  |   5 +-
 .../client/compute/ClientExecuteTaskRequest.java   |   3 +-
 .../processors/platform/utils/PlatformUtils.java   |   3 +-
 .../processors/query/GridQueryProcessor.java       |   3 +-
 .../processors/query/QueryTypeDescriptorImpl.java  |   3 +-
 .../internal/processors/query/QueryUtils.java      |  11 +-
 .../rest/protocols/tcp/GridTcpRestNioListener.java |   3 +-
 .../processors/security/IgniteSecurityAdapter.java |   4 +-
 .../processors/task/GridTaskProcessor.java         |   3 +-
 .../apache/ignite/internal/util/IgniteUtils.java   |  28 ---
 .../spi/deployment/local/LocalDeploymentSpi.java   |   3 +-
 .../class_list_exploit_excluded_jobs_included.txt  |  19 ++
 .../class_list_exploit_with_jobs_included.txt      |  23 +++
 .../binary/RawBinaryObjectExtractorTest.java       |   3 +-
 .../optimized/OptimizedMarshallerTest.java         |   3 +-
 .../optimized/OptimizedObjectStreamSelfTest.java   |   2 +-
 .../ignite/p2p/P2PScanQueryUndeployTest.java       |   4 +-
 ...rMetricsSnapshotSerializeCompatibilityTest.java |   3 +-
 .../SocketStreamerUnmarshalVulnerabilityTest.java  |  37 ++--
 .../testframework/junits/GridAbstractTest.java     |   3 +-
 .../processors/query/h2/dml/UpdatePlanBuilder.java |   3 +-
 .../protocols/http/jetty/GridJettyRestHandler.java |   3 +-
 .../internal/client/thin/TcpIgniteClient.java      |   5 +-
 43 files changed, 386 insertions(+), 311 deletions(-)

diff --git 
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
index f00e26fb26a..a4a7de22b8b 100644
--- 
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java
@@ -63,6 +63,7 @@ import org.apache.ignite.binary.BinaryTypeConfiguration;
 import org.apache.ignite.internal.DuplicateTypeIdException;
 import org.apache.ignite.internal.UnregisteredBinaryTypeException;
 import org.apache.ignite.internal.UnregisteredClassException;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.marshaller.optimized.OptimizedMarshaller;
 import org.apache.ignite.internal.util.CommonUtils;
 import org.apache.ignite.internal.util.lang.GridMapEntry;
@@ -372,7 +373,7 @@ public class BinaryContext {
                         String affField = affFields.remove(clsName0);
 
                         if (affField == null) {
-                            Class<?> cls = CommonUtils.classForName(clsName0, 
null);
+                            Class<?> cls = 
ClassLoaderUtils.classForName(clsName0);
 
                             if (cls != null)
                                 affField = affFldNameProvider.apply(cls);
@@ -386,7 +387,7 @@ public class BinaryContext {
                     String affField = affFields.remove(clsName);
 
                     if (affField == null) {
-                        Class<?> cls = CommonUtils.classForName(clsName, null);
+                        Class<?> cls = ClassLoaderUtils.classForName(clsName);
 
                         if (cls != null)
                             affField = affFldNameProvider.apply(cls);
@@ -740,7 +741,7 @@ public class BinaryContext {
                 if (clsName == null)
                     throw new ClassNotFoundException("Unknown type ID: " + 
typeId);
 
-                cls = CommonUtils.forName(clsName, ldr, null, 
Marshallers.USE_CACHE.get());
+                cls = ClassLoaderUtils.forName(clsName, ldr);
 
                 desc = descByCls.get(cls);
 
@@ -1496,7 +1497,7 @@ public class BinaryContext {
 
         optmMarsh.onUndeploy(ldr);
 
-        CommonUtils.clearClassCache(ldr);
+        ClassLoaderUtils.clearClassCache(ldr);
     }
 
     /**
diff --git 
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
index 14a97520c81..e10222a6593 100644
--- 
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
@@ -79,6 +79,7 @@ import org.apache.ignite.cache.affinity.AffinityKeyMapped;
 import org.apache.ignite.configuration.BinaryConfiguration;
 import org.apache.ignite.internal.binary.streams.BinaryInputStream;
 import org.apache.ignite.internal.binary.streams.BinaryOutputStream;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.util.CommonUtils;
 import org.apache.ignite.internal.util.MutableSingletonList;
@@ -1632,17 +1633,16 @@ public class BinaryUtils {
             cls = ctx.descriptorForTypeId(true, typeId, ldr, 
false).describedClass();
         else {
             String clsName = doReadClassName(in);
-            boolean useCache = Marshallers.USE_CACHE.get();
 
             try {
-                cls = CommonUtils.forName(clsName, ldr, null, 
Marshallers.USE_CACHE.get());
+                cls = ClassLoaderUtils.forName(clsName, ldr);
             }
             catch (ClassNotFoundException e) {
                 throw new BinaryInvalidTypeException("Failed to load the 
class: " + clsName, e);
             }
 
             // forces registering of class by type id, at least locally
-            if (useCache)
+            if (Marshallers.USE_CACHE.get())
                 ctx.registerType(cls, false, false);
         }
 
@@ -1666,7 +1666,7 @@ public class BinaryUtils {
             cls = ctx.descriptorForTypeId(true, typeId, ldr, 
registerMeta).describedClass();
         else {
             try {
-                cls = CommonUtils.forName(clsName, ldr, null, 
Marshallers.USE_CACHE.get());
+                cls = ClassLoaderUtils.forName(clsName, ldr);
             }
             catch (ClassNotFoundException e) {
                 throw new BinaryInvalidTypeException("Failed to load the 
class: " + clsName, e);
@@ -1719,10 +1719,9 @@ public class BinaryUtils {
      * Having target class in place we simply read ordinal and create final 
representation.
      *
      * @param cls Enum class.
-     * @param useCache True if class loader cache will be used, false 
otherwise.
      * @return Value.
      */
-    static Enum<?> doReadEnum(BinaryInputStream in, Class<?> cls, boolean 
useCache) throws BinaryObjectException {
+    static Enum<?> doReadEnum(BinaryInputStream in, Class<?> cls) throws 
BinaryObjectException {
         assert cls != null;
 
         if (!cls.isEnum())
@@ -1730,7 +1729,7 @@ public class BinaryUtils {
 
         int ord = in.readInt();
 
-        if (useCache)
+        if (Marshallers.USE_CACHE.get())
             return BinaryEnumCache.get(cls, ord);
         else
             return uncachedEnumValue(cls, ord);
@@ -1773,7 +1772,7 @@ public class BinaryUtils {
             if (flag == GridBinaryMarshaller.NULL)
                 arr[i] = null;
             else
-                arr[i] = doReadEnum(in, doReadClass(in, ctx, ldr), 
Marshallers.USE_CACHE.get());
+                arr[i] = doReadEnum(in, doReadClass(in, ctx, ldr));
         }
 
         return arr;
diff --git 
a/modules/binary/api/src/main/java/org/apache/ignite/internal/marshaller/ClassLoaderUtils.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/marshaller/ClassLoaderUtils.java
new file mode 100644
index 00000000000..9c6be55dd34
--- /dev/null
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/marshaller/ClassLoaderUtils.java
@@ -0,0 +1,209 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ignite.internal.marshaller;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import org.apache.ignite.internal.processors.cache.CacheClassLoaderMarker;
+import org.apache.ignite.internal.util.CommonUtils;
+import org.apache.ignite.marshaller.MarshallerUtils;
+import org.apache.ignite.marshaller.Marshallers;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Utility class to deal with class loading.
+ * Contains internal class cache.
+ */
+public class ClassLoaderUtils {
+    /** Primitive class map. */
+    private static final Map<String, Class<?>> primitiveMap = new 
HashMap<>(16, .5f);
+
+    /** */
+    private static final ConcurrentMap<ClassLoader, ConcurrentMap<String, 
Class<?>>> classCache =
+        new ConcurrentHashMap<>();
+
+    static {
+        primitiveMap.put("byte", byte.class);
+        primitiveMap.put("short", short.class);
+        primitiveMap.put("int", int.class);
+        primitiveMap.put("long", long.class);
+        primitiveMap.put("float", float.class);
+        primitiveMap.put("double", double.class);
+        primitiveMap.put("char", char.class);
+        primitiveMap.put("boolean", boolean.class);
+        primitiveMap.put("void", void.class);
+    }
+
+    /**
+     * Gets class for the given name if it can be loaded or {@code null}.
+     *
+     * @param cls Class.
+     * @return Class or {@code null} if it can't be found.
+     */
+    @Nullable public static Class<?> classForName(@Nullable String cls) {
+        return classForName(cls, false);
+    }
+
+    /**
+     * Gets class for the given name if it can be loaded or {@code null}.
+     *
+     * @param cls Class.
+     * @return Class or {@code null} if it can't be found.
+     */
+    @Nullable public static Class<?> classForNameWithPrimitives(@Nullable 
String cls) {
+        return classForName(cls, true);
+    }
+
+    /**
+     * Gets class for the given name if it can be loaded or default given 
class.
+     *
+     * @param cls Class.
+     * @param includePrimitiveTypes Whether class resolution should include 
primitive types
+     *                              (i.e. "int" will resolve to int.class if 
flag is set)
+     * @return Class or default given class if it can't be found.
+     */
+    @Nullable private static Class<?> classForName(
+        @Nullable String cls,
+        boolean includePrimitiveTypes
+    ) {
+        Class<?> clazz;
+        if (cls == null)
+            return null;
+        else if (!includePrimitiveTypes || cls.length() > 7 || (clazz = 
primitiveMap.get(cls)) == null) {
+            try {
+                return Class.forName(cls);
+            }
+            catch (ClassNotFoundException ignore) {
+                return null;
+            }
+        }
+        return clazz;
+    }
+
+    /**
+     * Gets class for provided name. Accepts primitive types names.
+     *
+     * @param clsName Class name.
+     * @param ldr Class loader.
+     * @param useCache If true class loader and result should be cached 
internally, false otherwise.
+     * @return Class.
+     * @throws ClassNotFoundException If class not found.
+     */
+    public static Class<?> forName(
+        String clsName,
+        @Nullable ClassLoader ldr,
+        boolean useCache
+    ) throws ClassNotFoundException {
+        assert clsName != null;
+
+        Class<?> cls = primitiveMap.get(clsName);
+
+        if (cls != null)
+            return cls;
+
+        ldr = ldr != null ? ldr : CommonUtils.gridClassLoader();
+
+        if (!useCache) {
+            cls = Class.forName(clsName, true, ldr);
+
+            return cls;
+        }
+
+        ConcurrentMap<String, Class<?>> ldrMap = classCache.get(ldr);
+
+        if (ldrMap == null) {
+            ConcurrentMap<String, Class<?>> old = classCache.putIfAbsent(ldr, 
ldrMap = new ConcurrentHashMap<>());
+
+            if (old != null)
+                ldrMap = old;
+        }
+
+        cls = ldrMap.get(clsName);
+
+        if (cls == null) {
+            if (!MarshallerUtils.classNameFilter().apply(clsName))
+                throw new ClassNotFoundException("Deserialization of class " + 
clsName + " is disallowed.");
+
+            // Avoid class caching inside Class.forName
+            if (ldr instanceof CacheClassLoaderMarker)
+                cls = ldr.loadClass(clsName);
+            else
+                cls = Class.forName(clsName, true, ldr);
+
+            Class<?> old = ldrMap.putIfAbsent(clsName, cls);
+
+            if (old != null)
+                cls = old;
+        }
+
+        return cls;
+    }
+
+    /**
+     * Gets class for provided name. Accepts primitive types names.
+     *
+     * @param clsName Class name.
+     * @param ldr Class loader.
+     * @return Class.
+     * @throws ClassNotFoundException If class not found.
+     */
+    public static Class<?> forName(String clsName, @Nullable ClassLoader ldr) 
throws ClassNotFoundException {
+        return forName(clsName, ldr, Marshallers.USE_CACHE.get());
+    }
+
+    /**
+     * Gets class for provided name. Accepts primitive types names.
+     *
+     * @param clsName Class name.
+     * @return Class.
+     * @throws ClassNotFoundException If class not found.
+     */
+    public static Class<?> forName(String clsName) throws 
ClassNotFoundException {
+        return forName(clsName, null, Marshallers.USE_CACHE.get());
+    }
+
+    /**
+     * Clears class associated with provided class loader from class cache.
+     *
+     * @param ldr Class loader.
+     * @param clsName Class name of clearing class.
+     */
+    public static void clearClassFromClassCache(ClassLoader ldr, String 
clsName) {
+        ConcurrentMap<String, Class<?>> map = classCache.get(ldr);
+
+        if (map != null)
+            map.remove(clsName);
+    }
+
+    /**
+     * Clears class cache for provided loader.
+     *
+     * @param ldr Class loader.
+     */
+    public static void clearClassCache(ClassLoader ldr) {
+        classCache.remove(ldr);
+    }
+
+    /**
+     * Completely clears class cache.
+     */
+    public static void clearClassCache() {
+        classCache.clear();
+    }
+}
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
index fca203666fe..888494a185c 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
@@ -43,7 +43,6 @@ import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.SB;
-import org.apache.ignite.marshaller.Marshallers;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -1404,7 +1403,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
             if (cls == null)
                 cls = cls0;
 
-            return BinaryUtils.doReadEnum(in, cls, 
Marshallers.USE_CACHE.get());
+            return BinaryUtils.doReadEnum(in, cls);
         }
         else
             return null;
@@ -1927,8 +1926,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
                 break;
 
             case ENUM:
-                obj = BinaryUtils.doReadEnum(in, BinaryUtils.doReadClass(in, 
ctx, ldr),
-                    Marshallers.USE_CACHE.get());
+                obj = BinaryUtils.doReadEnum(in, BinaryUtils.doReadClass(in, 
ctx, ldr));
 
                 break;
 
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java
index 4fc65707b16..ee60218d0b1 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderEnum.java
@@ -20,8 +20,7 @@ package org.apache.ignite.internal.binary.builder;
 import org.apache.ignite.binary.BinaryInvalidTypeException;
 import org.apache.ignite.internal.binary.BinaryWriterEx;
 import org.apache.ignite.internal.binary.GridBinaryMarshaller;
-import org.apache.ignite.internal.util.CommonUtils;
-import org.apache.ignite.marshaller.Marshallers;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 
 /**
  *
@@ -58,7 +57,7 @@ class BinaryBuilderEnum implements 
BinaryBuilderSerializationAware {
             Class cls;
 
             try {
-                cls = CommonUtils.forName(reader.readString(), 
reader.binaryContext().classLoader(), null, Marshallers.USE_CACHE.get());
+                cls = ClassLoaderUtils.forName(reader.readString(), 
reader.binaryContext().classLoader());
             }
             catch (ClassNotFoundException e) {
                 throw new BinaryInvalidTypeException("Failed to load the 
class: " + clsName, e);
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java
index b90d60aa070..630ca685e80 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryEnumArrayLazyValue.java
@@ -21,8 +21,7 @@ import org.apache.ignite.binary.BinaryInvalidTypeException;
 import org.apache.ignite.binary.BinaryObjectException;
 import org.apache.ignite.internal.binary.BinaryWriterEx;
 import org.apache.ignite.internal.binary.GridBinaryMarshaller;
-import org.apache.ignite.internal.util.CommonUtils;
-import org.apache.ignite.marshaller.Marshallers;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 
 /**
  *
@@ -51,7 +50,7 @@ class BinaryEnumArrayLazyValue extends 
BinaryAbstractLazyValue {
             Class cls;
 
             try {
-                cls = CommonUtils.forName(reader.readString(), 
reader.binaryContext().classLoader(), null, Marshallers.USE_CACHE.get());
+                cls = ClassLoaderUtils.forName(reader.readString(), 
reader.binaryContext().classLoader());
             }
             catch (ClassNotFoundException e) {
                 throw new BinaryInvalidTypeException("Failed to load the 
class: " + clsName, e);
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java
index c2110b6099b..008face8a81 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectArrayLazyValue.java
@@ -20,8 +20,7 @@ package org.apache.ignite.internal.binary.builder;
 import org.apache.ignite.binary.BinaryInvalidTypeException;
 import org.apache.ignite.internal.binary.BinaryWriterEx;
 import org.apache.ignite.internal.binary.GridBinaryMarshaller;
-import org.apache.ignite.internal.util.CommonUtils;
-import org.apache.ignite.marshaller.Marshallers;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 
 /**
  *
@@ -50,7 +49,7 @@ class BinaryObjectArrayLazyValue extends 
BinaryAbstractLazyValue {
             Class cls;
 
             try {
-                cls = CommonUtils.forName(reader.readString(), 
reader.binaryContext().classLoader(), null, Marshallers.USE_CACHE.get());
+                cls = ClassLoaderUtils.forName(reader.readString(), 
reader.binaryContext().classLoader());
             }
             catch (ClassNotFoundException e) {
                 throw new BinaryInvalidTypeException("Failed to load the 
class: " + clsName, e);
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
index 4a4fa0f242f..65c31228303 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
@@ -38,10 +38,10 @@ import org.apache.ignite.internal.binary.BinaryObjectImpl;
 import org.apache.ignite.internal.binary.BinaryUtils;
 import org.apache.ignite.internal.binary.BinaryWriterEx;
 import org.apache.ignite.internal.binary.GridBinaryMarshaller;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.util.CommonUtils;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.lang.IgniteBiTuple;
-import org.apache.ignite.marshaller.Marshallers;
 import org.apache.ignite.thread.IgniteThread;
 import org.jetbrains.annotations.Nullable;
 
@@ -152,7 +152,7 @@ class BinaryObjectBuilderImpl implements 
BinaryObjectBuilderEx {
             Class cls;
 
             try {
-                cls = CommonUtils.forName(clsNameToWrite, ctx.classLoader(), 
null, Marshallers.USE_CACHE.get());
+                cls = ClassLoaderUtils.forName(clsNameToWrite, 
ctx.classLoader());
             }
             catch (ClassNotFoundException e) {
                 throw new BinaryInvalidTypeException("Failed to load the 
class: " + clsNameToWrite, e);
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerImpl.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerImpl.java
index 9c5549a29c6..ec917263ecb 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerImpl.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerImpl.java
@@ -26,7 +26,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
-import org.apache.ignite.internal.util.CommonUtils;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller;
 import org.apache.ignite.marshaller.Marshallers;
@@ -190,29 +190,16 @@ public class OptimizedMarshallerImpl extends 
AbstractNodeNameAwareMarshaller imp
 
     /** {@inheritDoc} */
     @Override protected <T> T unmarshal0(InputStream in, @Nullable ClassLoader 
clsLdr) throws IgniteCheckedException {
-        return unmarshal0(in, clsLdr, Marshallers.USE_CACHE.get());
-    }
-
-    /**
-     * Unmarshals object from the input stream using given class loader.
-     * This method should not close given input stream.
-     *
-     * @param <T> Type of unmarshalled object.
-     * @param in Input stream.
-     * @param clsLdr Class loader to use.
-     * @param useCache True if class loader cache will be used, false 
otherwise.
-     * @return Unmarshalled object.
-     * @throws IgniteCheckedException If unmarshalling failed.
-     */
-    protected <T> T unmarshal0(InputStream in, @Nullable ClassLoader clsLdr, 
boolean useCache) throws IgniteCheckedException {
         assert in != null;
 
+        boolean useCache = Marshallers.USE_CACHE.get();
+
         OptimizedObjectInputStream objIn = null;
 
         try {
             objIn = !useCache ? nonCachedRegistry.in() : registry.in();
 
-            objIn.context(clsMap, ctx, mapper, clsLdr != null ? clsLdr : 
dfltClsLdr, useCache);
+            objIn.context(clsMap, ctx, mapper, clsLdr != null ? clsLdr : 
dfltClsLdr);
 
             objIn.in().inputStream(in);
 
@@ -245,8 +232,7 @@ public class OptimizedMarshallerImpl extends 
AbstractNodeNameAwareMarshaller imp
         try {
             objIn = registry.in();
 
-            objIn.context(clsMap, ctx, mapper,
-                clsLdr != null ? clsLdr : dfltClsLdr, 
Marshallers.USE_CACHE.get());
+            objIn.context(clsMap, ctx, mapper, clsLdr != null ? clsLdr : 
dfltClsLdr);
 
             objIn.in().bytes(arr, arr.length);
 
@@ -305,7 +291,7 @@ public class OptimizedMarshallerImpl extends 
AbstractNodeNameAwareMarshaller imp
                 clsMap.remove(cls);
         }
 
-        CommonUtils.clearClassCache(ldr);
+        ClassLoaderUtils.clearClassCache(ldr);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerUtils.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerUtils.java
index 1c9836956ad..c514d7293f4 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerUtils.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerUtils.java
@@ -30,7 +30,7 @@ import java.util.List;
 import java.util.concurrent.ConcurrentMap;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
-import org.apache.ignite.internal.util.CommonUtils;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.marshaller.MarshallerContext;
@@ -301,7 +301,7 @@ class OptimizedMarshallerUtils {
             throw new IOException("Failed to resolve class for ID: " + typeId, 
e);
         }
 
-        Class cls = CommonUtils.forName(clsName, ldr, null, 
Marshallers.USE_CACHE.get());
+        Class cls = ClassLoaderUtils.forName(clsName, ldr);
 
         OptimizedClassDescriptor desc = clsMap.get(cls);
 
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectInputStream.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectInputStream.java
index 6b6f2a57515..efa48690525 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectInputStream.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectInputStream.java
@@ -42,12 +42,12 @@ import java.util.Properties;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentMap;
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.util.CommonUtils;
 import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.io.GridDataInput;
 import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.apache.ignite.marshaller.MarshallerContext;
-import org.apache.ignite.marshaller.MarshallerUtils;
 import org.apache.ignite.marshaller.Marshallers;
 
 import static 
org.apache.ignite.internal.marshaller.optimized.OptimizedMarshallerUtils.ARRAY_LIST;
@@ -148,20 +148,18 @@ class OptimizedObjectInputStream extends 
ObjectInputStream {
      * @param ctx Context.
      * @param mapper ID mapper.
      * @param clsLdr Class loader.
-     * @param useCache True if class loader cache will be used, false 
otherwise.
      */
     void context(
         ConcurrentMap<Class, OptimizedClassDescriptor> clsMap,
         MarshallerContext ctx,
         OptimizedMarshallerIdMapper mapper,
-        ClassLoader clsLdr,
-        boolean useCache
+        ClassLoader clsLdr
     ) {
         this.clsMap = clsMap;
         this.ctx = ctx;
         this.mapper = mapper;
         this.clsLdr = clsLdr;
-        this.useCache = useCache;
+        this.useCache = Marshallers.USE_CACHE.get();
     }
 
     /**
@@ -348,7 +346,7 @@ class OptimizedObjectInputStream extends ObjectInputStream {
                 OptimizedClassDescriptor desc = typeId == 0
                     ? classDescriptor(
                         clsMap,
-                        CommonUtils.forName(readUTF(), clsLdr, 
MarshallerUtils.classNameFilter(), useCache),
+                        ClassLoaderUtils.forName(readUTF(), clsLdr, useCache),
                         useCache,
                         ctx,
                         mapper)
@@ -387,7 +385,7 @@ class OptimizedObjectInputStream extends ObjectInputStream {
     private Class<?> readClass() throws ClassNotFoundException, IOException {
         int compTypeId = readInt();
 
-        return compTypeId == 0 ? CommonUtils.forName(readUTF(), clsLdr, null, 
useCache) :
+        return compTypeId == 0 ? ClassLoaderUtils.forName(readUTF(), clsLdr, 
useCache) :
             classDescriptor(clsMap, compTypeId, clsLdr, useCache, ctx, 
mapper).describedClass();
     }
 
@@ -546,7 +544,7 @@ class OptimizedObjectInputStream extends ObjectInputStream {
         // Must have 'Class.forName()' instead of clsLoader.loadClass()
         // due to weird ClassNotFoundExceptions for arrays of classes
         // in certain cases.
-        return CommonUtils.forName(desc.getName(), clsLdr, 
MarshallerUtils.classNameFilter(), Marshallers.USE_CACHE.get());
+        return ClassLoaderUtils.forName(desc.getName(), clsLdr);
     }
 
     /**
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
index f1480fe0a10..6a5c5cb6fbd 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/marshaller/jdk/JdkMarshallerObjectInputStream.java
@@ -21,9 +21,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectStreamClass;
-import org.apache.ignite.internal.util.CommonUtils;
-import org.apache.ignite.marshaller.MarshallerUtils;
-import org.apache.ignite.marshaller.Marshallers;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 
 /**
  * This class defines custom JDK object input stream.
@@ -53,7 +51,7 @@ class JdkMarshallerObjectInputStream extends 
ObjectInputStream {
         // Must have 'Class.forName()' instead of clsLoader.loadClass()
         // due to weird ClassNotFoundExceptions for arrays of classes
         // in certain cases.
-        return CommonUtils.forName(desc.getName(), clsLdr, 
MarshallerUtils.classNameFilter(), Marshallers.USE_CACHE.get());
+        return ClassLoaderUtils.forName(desc.getName(), clsLdr);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
index e2fbee0efe2..a3501b46a07 100644
--- 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
@@ -100,6 +100,7 @@ import org.apache.calcite.sql.validate.SqlNameMatchers;
 import org.apache.calcite.util.ImmutableBitSet;
 import org.apache.calcite.util.Util;
 import org.apache.ignite.IgniteException;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import 
org.apache.ignite.internal.processors.query.calcite.prepare.BaseQueryContext;
 import 
org.apache.ignite.internal.processors.query.calcite.prepare.bounds.ExactBounds;
 import 
org.apache.ignite.internal.processors.query.calcite.prepare.bounds.MultiBounds;
@@ -115,7 +116,6 @@ import 
org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactor
 import org.apache.ignite.internal.processors.query.calcite.util.Commons;
 import org.apache.ignite.internal.processors.query.calcite.util.RexUtils;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.U;
 
 /**
  * Utilities for converting {@link RelNode} into JSON format.
@@ -211,7 +211,7 @@ class RelJson {
     /** */
     private static Class<?> classForName(String typeName, boolean 
skipNotFound) {
         try {
-            return U.forName(typeName, U.gridClassLoader());
+            return ClassLoaderUtils.forName(typeName);
         }
         catch (ClassNotFoundException e) {
             if (!skipNotFound)
diff --git 
a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
index ab5ff9f2a86..cb2c770007f 100644
--- 
a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
+++ 
b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java
@@ -67,8 +67,6 @@ import java.util.Map;
 import java.util.ServiceLoader;
 import java.util.Set;
 import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.TimeUnit;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteClientDisconnectedException;
@@ -80,7 +78,6 @@ import 
org.apache.ignite.internal.IgniteClientDisconnectedCheckedException;
 import org.apache.ignite.internal.IgniteFutureCancelledCheckedException;
 import org.apache.ignite.internal.IgniteFutureTimeoutCheckedException;
 import org.apache.ignite.internal.IgniteInterruptedCheckedException;
-import org.apache.ignite.internal.processors.cache.CacheClassLoaderMarker;
 import org.apache.ignite.internal.util.lang.GridClosureException;
 import org.apache.ignite.internal.util.lang.GridTuple;
 import org.apache.ignite.internal.util.typedef.C1;
@@ -92,7 +89,6 @@ import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.apache.ignite.internal.util.worker.GridWorker;
 import org.apache.ignite.lang.IgniteFutureCancelledException;
 import org.apache.ignite.lang.IgniteFutureTimeoutException;
-import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.thread.IgniteThread;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -250,15 +246,8 @@ public abstract class CommonUtils {
     /** Class loader used to load Ignite. */
     private static final ClassLoader gridClassLoader = 
CommonUtils.class.getClassLoader();
 
-    /** Primitive class map. */
-    private static final Map<String, Class<?>> primitiveMap = new 
HashMap<>(16, .5f);
-
-    /** */
-    private static final ConcurrentMap<ClassLoader, ConcurrentMap<String, 
Class>> classCache =
-        new ConcurrentHashMap<>();
-
     /** */
-    private static final Class<?> GEOMETRY_CLASS = 
classForName("org.locationtech.jts.geom.Geometry", null);
+    private static final Class<?> GEOMETRY_CLASS;
 
     /** Boxed class map. */
     private static final Map<Class<?>, Class<?>> boxedClsMap = new 
HashMap<>(16, .5f);
@@ -276,15 +265,16 @@ public abstract class CommonUtils {
     private static final Set<Class<?>> SQL_TYPES = createSqlTypes();
 
     static {
-        primitiveMap.put("byte", byte.class);
-        primitiveMap.put("short", short.class);
-        primitiveMap.put("int", int.class);
-        primitiveMap.put("long", long.class);
-        primitiveMap.put("float", float.class);
-        primitiveMap.put("double", double.class);
-        primitiveMap.put("char", char.class);
-        primitiveMap.put("boolean", boolean.class);
-        primitiveMap.put("void", void.class);
+        Class<?> geomCls = null;
+
+        try {
+            geomCls = Class.forName("org.locationtech.jts.geom.Geometry");
+        }
+        catch (ClassNotFoundException ignore) {
+            // Ignore.
+        }
+
+        GEOMETRY_CLASS = geomCls;
 
         boxedClsMap.put(byte.class, Byte.class);
         boxedClsMap.put(short.class, Short.class);
@@ -793,142 +783,6 @@ public abstract class CommonUtils {
         }
     }
 
-    /**
-     * Gets class for the given name if it can be loaded or default given 
class.
-     *
-     * @param cls Class.
-     * @param dflt Default class to return.
-     * @return Class or default given class if it can't be found.
-     */
-    @Nullable public static Class<?> classForName(@Nullable String cls, 
@Nullable Class<?> dflt) {
-        return classForName(cls, dflt, false);
-    }
-
-    /**
-     * Gets class for the given name if it can be loaded or default given 
class.
-     *
-     * @param cls Class.
-     * @param dflt Default class to return.
-     * @param includePrimitiveTypes Whether class resolution should include 
primitive types
-     *                              (i.e. "int" will resolve to int.class if 
flag is set)
-     * @return Class or default given class if it can't be found.
-     */
-    @Nullable public static Class<?> classForName(
-        @Nullable String cls,
-        @Nullable Class<?> dflt,
-        boolean includePrimitiveTypes
-    ) {
-        Class<?> clazz;
-        if (cls == null)
-            clazz = dflt;
-        else if (!includePrimitiveTypes || cls.length() > 7 || (clazz = 
primitiveMap.get(cls)) == null) {
-            try {
-                clazz = Class.forName(cls);
-            }
-            catch (ClassNotFoundException ignore) {
-                clazz = dflt;
-            }
-        }
-        return clazz;
-    }
-
-    /**
-     * Gets class for provided name. Accepts primitive types names.
-     *
-     * @param clsName Class name.
-     * @param ldr Class loader.
-     * @param useCache If true class loader and result should be cached 
internally, false otherwise.
-     * @return Class.
-     * @throws ClassNotFoundException If class not found.
-     */
-    public static Class<?> forName(
-        String clsName,
-        @Nullable ClassLoader ldr,
-        @Nullable IgnitePredicate<String> clsFilter,
-        boolean useCache
-    ) throws ClassNotFoundException {
-        assert clsName != null;
-
-        Class<?> cls = primitiveMap.get(clsName);
-
-        if (cls != null)
-            return cls;
-
-        if (ldr != null) {
-            if (!useCache) {
-                cls = Class.forName(clsName, true, ldr);
-
-                return cls;
-            }
-        }
-        else
-            ldr = gridClassLoader;
-
-        if (!useCache) {
-            cls = Class.forName(clsName, true, ldr);
-
-            return cls;
-        }
-
-        ConcurrentMap<String, Class> ldrMap = classCache.get(ldr);
-
-        if (ldrMap == null) {
-            ConcurrentMap<String, Class> old = classCache.putIfAbsent(ldr, 
ldrMap = new ConcurrentHashMap<>());
-
-            if (old != null)
-                ldrMap = old;
-        }
-
-        cls = ldrMap.get(clsName);
-
-        if (cls == null) {
-            if (clsFilter != null && !clsFilter.apply(clsName))
-                throw new ClassNotFoundException("Deserialization of class " + 
clsName + " is disallowed.");
-
-            // Avoid class caching inside Class.forName
-            if (ldr instanceof CacheClassLoaderMarker)
-                cls = ldr.loadClass(clsName);
-            else
-                cls = Class.forName(clsName, true, ldr);
-
-            Class old = ldrMap.putIfAbsent(clsName, cls);
-
-            if (old != null)
-                cls = old;
-        }
-
-        return cls;
-    }
-
-    /**
-     * Clears class associated with provided class loader from class cache.
-     *
-     * @param ldr Class loader.
-     * @param clsName Class name of clearing class.
-     */
-    public static void clearClassFromClassCache(ClassLoader ldr, String 
clsName) {
-        ConcurrentMap<String, Class> map = classCache.get(ldr);
-
-        if (map != null)
-            map.remove(clsName);
-    }
-
-    /**
-     * Clears class cache for provided loader.
-     *
-     * @param ldr Class loader.
-     */
-    public static void clearClassCache(ClassLoader ldr) {
-        classCache.remove(ldr);
-    }
-
-    /**
-     * Completely clears class cache.
-     */
-    public static void clearClassCache() {
-        classCache.clear();
-    }
-
     /**
      * Extracts full name of enclosing class from JDK8 lambda class name.
      *
@@ -1452,22 +1306,14 @@ public abstract class CommonUtils {
     }
 
     /**
-     * Returns a first non-null value in a given array, if such is present.
+     * Returns a first non-null value, if such is present.
      *
-     * @param vals Input array.
-     * @return First non-null value, or {@code null}, if array is empty or 
contains
-     *      only nulls.
+     * @param first First value.
+     * @param second Second value.
+     * @return First non-null value, or {@code null}, if both {@code null}.
      */
-    @Nullable public static <T> T firstNotNull(@Nullable T... vals) {
-        if (vals == null)
-            return null;
-
-        for (T val : vals) {
-            if (val != null)
-                return val;
-        }
-
-        return null;
+    @Nullable public static <T> T firstNotNull(@Nullable T first, @Nullable T 
second) {
+        return first != null ? first : second;
     }
 
     /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteComponentType.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteComponentType.java
index 532de3ceb41..47f194f3313 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteComponentType.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteComponentType.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal;
 
 import java.lang.reflect.Constructor;
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.compress.CompressionProcessor;
 import org.apache.ignite.internal.processors.query.NoOpQueryEngine;
 import org.apache.ignite.internal.util.IgniteUtils;
@@ -319,7 +320,7 @@ public enum IgniteComponentType {
     @Nullable public MessageFactoryProvider messageFactory() throws 
IgniteCheckedException {
         Class<?> cls;
 
-        if (msgFactoryCls == null || null == (cls = 
U.classForName(msgFactoryCls, null)))
+        if (msgFactoryCls == null || null == (cls = 
ClassLoaderUtils.classForName(msgFactoryCls)))
             return null;
 
         return (MessageFactoryProvider)U.newInstance(cls);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java 
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index db961ddbae9..3ba1de9a2af 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -110,6 +110,7 @@ import 
org.apache.ignite.internal.managers.indexing.GridIndexingManager;
 import 
org.apache.ignite.internal.managers.loadbalancer.GridLoadBalancerManager;
 import org.apache.ignite.internal.managers.systemview.GridSystemViewManager;
 import 
org.apache.ignite.internal.managers.systemview.IgniteConfigurationIterable;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.plugin.AbstractMessageFactoryProvider;
 import org.apache.ignite.internal.plugin.IgniteLogInfoProvider;
 import org.apache.ignite.internal.plugin.IgniteLogInfoProviderImpl;
@@ -1853,7 +1854,7 @@ public class IgniteKernal implements IgniteEx, 
Externalizable {
             notifyLifecycleBeansEx(LifecycleEventType.AFTER_NODE_STOP);
 
             // Clean internal class/classloader caches to avoid stopped 
contexts held in memory.
-            U.clearClassCache();
+            ClassLoaderUtils.clearClassCache();
             MarshallerExclusions.clearCache();
             BinaryUtils.clearCache();
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
index 0adf9f3c4a7..757239daf1f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
@@ -47,6 +47,7 @@ import org.apache.ignite.compute.ComputeLoadBalancer;
 import org.apache.ignite.compute.ComputeTaskContinuousMapper;
 import org.apache.ignite.compute.ComputeTaskSession;
 import org.apache.ignite.internal.executor.GridExecutorService;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap;
 import 
org.apache.ignite.internal.processors.cache.persistence.filename.SharedFileTree;
 import org.apache.ignite.internal.processors.closure.GridClosureProcessor;
@@ -427,7 +428,7 @@ public class MarshallerContextImpl implements 
MarshallerContext {
         if (clsName == null)
             throw new ClassNotFoundException("Unknown type ID: " + typeId);
 
-        return U.forName(clsName, ldr, MarshallerUtils.classNameFilter());
+        return ClassLoaderUtils.forName(clsName, ldr);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
index ab4c55c7b52..60a6a4921e6 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
@@ -85,6 +85,7 @@ import org.apache.ignite.internal.binary.BinaryUtils;
 import org.apache.ignite.internal.jdbc2.JdbcBlob;
 import org.apache.ignite.internal.jdbc2.JdbcClob;
 import org.apache.ignite.internal.jdbc2.JdbcUtils;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.GridCacheUtils;
 import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
@@ -2483,7 +2484,7 @@ public class JdbcThinConnection implements Connection {
         @Override public Class getClass(int typeId, ClassLoader ldr)
             throws ClassNotFoundException, IgniteCheckedException {
 
-            return U.forName(getClassName(MarshallerPlatformIds.JAVA_ID, 
typeId), ldr, null);
+            return 
ClassLoaderUtils.forName(getClassName(MarshallerPlatformIds.JAVA_ID, typeId), 
ldr);
         }
 
         /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeployment.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeployment.java
index ca79f5fe927..666ed300a24 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeployment.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeployment.java
@@ -37,6 +37,7 @@ import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.compute.ComputeTask;
 import org.apache.ignite.configuration.DeploymentMode;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.util.GridLeanSet;
 import org.apache.ignite.internal.util.lang.GridMetadataAwareAdapter;
@@ -453,7 +454,7 @@ public class GridDeployment extends 
GridMetadataAwareAdapter implements GridDepl
 
         if (cls == null) {
             try {
-                cls = U.forName(clsName, clsLdr);
+                cls = ClassLoaderUtils.forName(clsName, clsLdr);
 
                 Class<?> cur = clss.putIfAbsent(clsName, cls);
 
@@ -476,7 +477,7 @@ public class GridDeployment extends 
GridMetadataAwareAdapter implements GridDepl
                         return F.t(cls, null);
                     else if (!a.equals(clsName)) {
                         try {
-                            cls = U.forName(a, clsLdr);
+                            cls = ClassLoaderUtils.forName(a, clsLdr);
                         }
                         catch (ClassNotFoundException ignored0) {
                             continue;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentLocalStore.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentLocalStore.java
index d9972a36bd8..f2d2410a9c1 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentLocalStore.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentLocalStore.java
@@ -31,6 +31,7 @@ import org.apache.ignite.configuration.DeploymentMode;
 import org.apache.ignite.events.DeploymentEvent;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteDeploymentCheckedException;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.util.GridAnnotationsCache;
 import org.apache.ignite.internal.util.GridClassLoaderCache;
 import org.apache.ignite.internal.util.typedef.internal.S;
@@ -194,7 +195,7 @@ class GridDeploymentLocalStore extends 
GridDeploymentStoreAdapter {
             // Check that class can be loaded.
             String clsName = meta.className();
 
-            Class<?> cls = U.forName(clsName != null ? clsName : alias, ldr);
+            Class<?> cls = ClassLoaderUtils.forName(clsName != null ? clsName 
: alias, ldr);
 
             if (spi.register(ldr, cls)) {
                 if (log.isDebugEnabled()) {
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java
index 8d1e9dee167..20ac3f01bae 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/deployment/GridDeploymentPerVersionStore.java
@@ -37,6 +37,7 @@ import org.apache.ignite.events.DiscoveryEvent;
 import org.apache.ignite.events.Event;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutObject;
 import org.apache.ignite.internal.util.GridAnnotationsCache;
 import org.apache.ignite.internal.util.GridBoundedConcurrentLinkedHashSet;
@@ -1321,10 +1322,10 @@ public class GridDeploymentPerVersionStore extends 
GridDeploymentStoreAdapter {
                 ClassLoader ldr = classLoader();
 
                // Clear static class cache.
-                
U.clearClassFromClassCache(ctx.cache().context().deploy().globalLoader(), 
sampleClassName());
+                
ClassLoaderUtils.clearClassFromClassCache(ctx.cache().context().deploy().globalLoader(),
 sampleClassName());
 
                 for (String alias : deployedClassMap().keySet())
-                    
U.clearClassFromClassCache(ctx.cache().context().deploy().globalLoader(), 
alias);
+                    
ClassLoaderUtils.clearClassFromClassCache(ctx.cache().context().deploy().globalLoader(),
 alias);
 
                 // Clear optimized marshaller's cache.
                 ctx.marshaller().onUndeploy(ldr);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/compute/ClientExecuteTaskRequest.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/compute/ClientExecuteTaskRequest.java
index 492e264272b..3869766ba0a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/compute/ClientExecuteTaskRequest.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/compute/ClientExecuteTaskRequest.java
@@ -22,6 +22,7 @@ import java.util.UUID;
 import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.binary.BinaryReaderEx;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import 
org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
 import org.apache.ignite.internal.processors.platform.client.ClientRequest;
 import org.apache.ignite.internal.processors.platform.client.ClientResponse;
@@ -106,7 +107,7 @@ public class ClientExecuteTaskRequest extends ClientRequest 
{
         Class<?> cls;
 
         try {
-            cls = U.forName(taskName, U.gridClassLoader());
+            cls = ClassLoaderUtils.forName(taskName);
         }
         catch (ClassNotFoundException ignored) {
             return false;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java
index 18ae92a112c..d9ad3951d57 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java
@@ -53,6 +53,7 @@ import org.apache.ignite.internal.binary.BinaryUtils;
 import org.apache.ignite.internal.binary.BinaryWriterEx;
 import org.apache.ignite.internal.binary.GridBinaryMarshaller;
 import org.apache.ignite.internal.binary.streams.BinaryInputStream;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.KeyCacheObjectImpl;
 import 
org.apache.ignite.internal.processors.cacheobject.PlatformCacheObjectImpl;
@@ -1019,7 +1020,7 @@ public class PlatformUtils {
         if (clsName == null)
             throw new IgniteException("Java object/factory class name is not 
set.");
 
-        Class cls = U.classForName(clsName, null);
+        Class cls = ClassLoaderUtils.classForName(clsName);
 
         if (cls == null)
             throw new IgniteException("Java object/factory class is not found 
(is it in the classpath?): " +
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
index 3008503660c..f88deb1c5c4 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
@@ -73,6 +73,7 @@ import 
org.apache.ignite.internal.cache.query.index.IndexQueryProcessor;
 import org.apache.ignite.internal.cache.query.index.IndexQueryResult;
 import 
org.apache.ignite.internal.cache.query.index.sorted.maintenance.RebuildIndexWorkflowCallback;
 import org.apache.ignite.internal.managers.communication.GridMessageListener;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.GridProcessorAdapter;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.CacheObject;
@@ -1475,7 +1476,7 @@ public class GridQueryProcessor extends 
GridProcessorAdapter {
         if (cacheObjProc instanceof CacheObjectBinaryProcessorImpl) {
             CacheObjectBinaryProcessorImpl binProc = 
(CacheObjectBinaryProcessorImpl)cacheObjProc;
 
-            Class<?> cls = U.box(U.classForName(clsName, null, true));
+            Class<?> cls = 
U.box(ClassLoaderUtils.classForNameWithPrimitives(clsName));
 
             if (cls != null) {
                 if (!platformOnly)
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
index 7b917e69a4d..6810b2a731b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
@@ -34,6 +34,7 @@ import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.cache.QueryIndexType;
 import org.apache.ignite.configuration.SqlConfiguration;
 import org.apache.ignite.internal.binary.BinaryUtils;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.CacheObjectValueContext;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
@@ -796,7 +797,7 @@ public class QueryTypeDescriptorImpl implements 
GridQueryTypeDescriptor {
                     .allMatch(x -> x == null || 
U.box(expColType.getComponentType()).isAssignableFrom(U.box(x.getClass())));
         }
         else if (cacheObjects.typeId(expColType.getName()) != 
((BinaryObject)val).type().typeId()) {
-            final Class<?> cls = 
U.classForName(((BinaryObject)val).type().typeName(), null, true);
+            final Class<?> cls = 
ClassLoaderUtils.classForNameWithPrimitives(((BinaryObject)val).type().typeName());
 
             return (cls == null && expColType == Object.class) || (cls != null 
&& expColType.isAssignableFrom(cls));
         }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
index 21a16ba4d61..f979957e425 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
@@ -44,6 +44,7 @@ import org.apache.ignite.cache.query.QueryCancelledException;
 import org.apache.ignite.cache.query.SqlFieldsQuery;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import 
org.apache.ignite.internal.processors.cache.CacheDefaultBinaryAffinityKeyMapper;
 import org.apache.ignite.internal.processors.cache.CacheObjectContext;
 import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor;
@@ -463,8 +464,8 @@ public class QueryUtils {
         // We need that to set correct types for _key and _val columns.
         // We better box these types - otherwise, if user provides, say, raw 
'byte' for
         // key or value (which they could), we'll deem key or value as Object 
which clearly is not right.
-        Class<?> keyCls = U.box(U.classForName(qryEntity.findKeyType(), null, 
true));
-        Class<?> valCls = U.box(U.classForName(qryEntity.findValueType(), 
null, true));
+        Class<?> keyCls = 
U.box(ClassLoaderUtils.classForNameWithPrimitives(qryEntity.findKeyType()));
+        Class<?> valCls = 
U.box(ClassLoaderUtils.classForNameWithPrimitives(qryEntity.findValueType()));
 
         // If local node has the classes and they are externalizable, we must 
use reflection properties.
         boolean keyMustDeserialize = mustDeserializeBinary(ctx, keyCls);
@@ -652,7 +653,7 @@ public class QueryUtils {
             Object dfltVal = dlftVals != null ? dlftVals.get(fieldName) : null;
 
             QueryBinaryProperty prop = buildBinaryProperty(ctx, fieldName,
-                U.classForName(fieldType, Object.class, true),
+                
U.firstNotNull(ClassLoaderUtils.classForNameWithPrimitives(fieldType), 
Object.class),
                 d.aliases(), isKeyField, notNull, dfltVal,
                 precision == null ? -1 : precision.getOrDefault(fieldName, -1),
                 scale == null ? -1 : scale.getOrDefault(fieldName, -1));
@@ -701,7 +702,7 @@ public class QueryUtils {
         QueryBinaryProperty prop = buildBinaryProperty(
             ctx,
             name,
-            U.classForName(typeName, Object.class, true),
+            
U.firstNotNull(ClassLoaderUtils.classForNameWithPrimitives(typeName), 
Object.class),
             d.aliases(),
             isKey,
             true,
@@ -730,7 +731,7 @@ public class QueryUtils {
                 d.keyFieldName(),
                 d.valueFieldName(),
                 entry.getKey(),
-                U.classForName(entry.getValue(), Object.class),
+                
U.firstNotNull(ClassLoaderUtils.classForName(entry.getValue()), Object.class),
                 d.aliases(),
                 notNulls != null && notNulls.contains(entry.getKey()),
                 coCtx);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java
index 63e86b309c2..89c77ac4fec 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java
@@ -32,6 +32,7 @@ import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.IgniteInterruptedCheckedException;
 import org.apache.ignite.internal.client.marshaller.GridClientMarshaller;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.rest.GridRestCommand;
 import org.apache.ignite.internal.processors.rest.GridRestProtocolHandler;
 import org.apache.ignite.internal.processors.rest.GridRestResponse;
@@ -339,7 +340,7 @@ public class GridTcpRestNioListener extends 
GridNioServerListenerAdapter<GridCli
         GridClientTaskRequest taskReq = (GridClientTaskRequest)msg;
 
         try {
-            return U.hasAnnotation(U.forName(taskReq.taskName(), null), 
InterruptibleVisorTask.class);
+            return 
U.hasAnnotation(ClassLoaderUtils.forName(taskReq.taskName()), 
InterruptibleVisorTask.class);
         }
         catch (ClassNotFoundException e) {
             log.warning("Task closure can't be found: [task=" + 
taskReq.taskName() + ']', e);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
index c9d7aa28acc..f5699df4f28 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/security/IgniteSecurityAdapter.java
@@ -26,8 +26,8 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import org.apache.ignite.binary.BinaryType;
 import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.GridProcessorAdapter;
-import org.apache.ignite.internal.util.typedef.internal.U;
 
 import static 
org.apache.ignite.internal.processors.security.SecurityUtils.doPrivileged;
 import static 
org.apache.ignite.internal.processors.security.SecurityUtils.isInIgnitePackage;
@@ -42,7 +42,7 @@ public abstract class IgniteSecurityAdapter extends 
GridProcessorAdapter impleme
 
     static {
         // ignite-binary-impl. Theoretically, can be absent in runtime due to 
other implementation of binary-api.
-        Class<?> jdkMarshCls = 
U.classForName("org.apache.ignite.marshaller.jdk.JdkMarshallerImpl", null);
+        Class<?> jdkMarshCls = 
ClassLoaderUtils.classForName("org.apache.ignite.marshaller.jdk.JdkMarshallerImpl");
 
         if (jdkMarshCls != null)
             MODULES.add(jdkMarshCls.getProtectionDomain().getCodeSource());
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
index d7faab230c4..4386f8313e3 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
@@ -65,6 +65,7 @@ import 
org.apache.ignite.internal.managers.communication.GridIoManager;
 import org.apache.ignite.internal.managers.communication.GridMessageListener;
 import org.apache.ignite.internal.managers.deployment.GridDeployment;
 import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.GridProcessorAdapter;
 import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
 import 
org.apache.ignite.internal.processors.cluster.IgniteChangeGlobalStateSupport;
@@ -1616,7 +1617,7 @@ public class GridTaskProcessor extends 
GridProcessorAdapter implements IgniteCha
 
         if (taskName != null) {
             try {
-                return U.forName(taskName, U.gridClassLoader());
+                return ClassLoaderUtils.forName(taskName);
             }
             catch (ClassNotFoundException ignored) {
                 // No-op.
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java 
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index d3770f81e54..5b87447a848 100755
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -5457,34 +5457,6 @@ public abstract class IgniteUtils extends CommonUtils {
         return i <= 0 ? dflt : i;
     }
 
-    /**
-     * Gets class for provided name. Accepts primitive types names.
-     *
-     * @param clsName Class name.
-     * @param ldr Class loader.
-     * @return Class.
-     * @throws ClassNotFoundException If class not found.
-     */
-    public static Class<?> forName(String clsName, @Nullable ClassLoader ldr) 
throws ClassNotFoundException {
-        return forName(clsName, ldr, null, Marshallers.USE_CACHE.get());
-    }
-
-    /**
-     * Gets class for provided name. Accepts primitive types names.
-     *
-     * @param clsName Class name.
-     * @param ldr Class loader.
-     * @return Class.
-     * @throws ClassNotFoundException If class not found.
-     */
-    public static Class<?> forName(
-        String clsName,
-        @Nullable ClassLoader ldr,
-        @Nullable IgnitePredicate<String> clsFilter
-    ) throws ClassNotFoundException {
-        return forName(clsName, ldr, clsFilter, Marshallers.USE_CACHE.get());
-    }
-
     /**
      * Applies a supplemental hash function to a given hashCode, which
      * defends against poor quality hash functions.  This is critical
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/deployment/local/LocalDeploymentSpi.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/deployment/local/LocalDeploymentSpi.java
index 886afffff12..fb54eea05dc 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/deployment/local/LocalDeploymentSpi.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/deployment/local/LocalDeploymentSpi.java
@@ -28,6 +28,7 @@ import org.apache.ignite.IgniteSystemProperties;
 import org.apache.ignite.SystemProperty;
 import org.apache.ignite.compute.ComputeTask;
 import org.apache.ignite.compute.ComputeTaskName;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.util.GridAnnotationsCache;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
@@ -149,7 +150,7 @@ public class LocalDeploymentSpi extends IgniteSpiAdapter 
implements DeploymentSp
             assert clsName != null;
 
             try {
-                Class<?> cls = U.forName(clsName, clsLdr);
+                Class<?> cls = ClassLoaderUtils.forName(clsName, clsLdr);
 
                 assert cls != null;
 
diff --git 
a/modules/core/src/test/config/class_list_exploit_excluded_jobs_included.txt 
b/modules/core/src/test/config/class_list_exploit_excluded_jobs_included.txt
new file mode 100644
index 00000000000..fcb882c5bce
--- /dev/null
+++ b/modules/core/src/test/config/class_list_exploit_excluded_jobs_included.txt
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.ignite.testframework.junits.multijvm.IgniteProcessProxy$NodeTask
+org.apache.ignite.stream.socket.SocketStreamerUnmarshalVulnerabilityTest$StartSocketRunnable
diff --git 
a/modules/core/src/test/config/class_list_exploit_with_jobs_included.txt 
b/modules/core/src/test/config/class_list_exploit_with_jobs_included.txt
new file mode 100644
index 00000000000..bce5a01b445
--- /dev/null
+++ b/modules/core/src/test/config/class_list_exploit_with_jobs_included.txt
@@ -0,0 +1,23 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.ignite.spi.discovery.tcp.DiscoveryUnmarshalVulnerabilityTest$Exploit
+org.apache.ignite.stream.socket.SocketStreamerUnmarshalVulnerabilityTest$Exploit
+org.apache.ignite.internal.processors.rest.TcpRestUnmarshalVulnerabilityTest$Exploit
+org.apache.ignite.internal.processors.rest.JettyRestProcessorClassFilterTest$Exploit
+org.apache.ignite.testframework.junits.multijvm.IgniteProcessProxy$NodeTask
+org.apache.ignite.stream.socket.SocketStreamerUnmarshalVulnerabilityTest$StartSocketRunnable
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java
index 721dbe731de..8b0b580536b 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/binary/RawBinaryObjectExtractorTest.java
@@ -30,6 +30,7 @@ import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.internal.binary.builder.BinaryObjectBuilders;
 import 
org.apache.ignite.internal.binary.mutabletest.GridBinaryTestClasses.TestObjectAllTypes;
 import org.apache.ignite.internal.binary.streams.BinaryStreams;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.marshaller.MarshallerContext;
 import org.apache.ignite.marshaller.Marshallers;
@@ -139,7 +140,7 @@ public class RawBinaryObjectExtractorTest extends 
GridCommonAbstractTest {
 
         /** {@inheritDoc} */
         @Override public Class<?> getClass(int typeId, ClassLoader ldr) throws 
ClassNotFoundException {
-            return U.forName(clsNamesByTypeId.get(typeId), ldr);
+            return ClassLoaderUtils.forName(clsNamesByTypeId.get(typeId), ldr);
         }
 
         /** {@inheritDoc} */
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerTest.java
index e4aa8de4bdc..974efa2ee5f 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedMarshallerTest.java
@@ -31,6 +31,7 @@ import java.util.Collection;
 import java.util.concurrent.Callable;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.compute.ComputeJobAdapter;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.marshaller.GridMarshallerTestInheritedBean;
 import org.apache.ignite.marshaller.Marshaller;
@@ -52,7 +53,7 @@ public class OptimizedMarshallerTest extends 
GridCommonAbstractTest {
      * @return Marshaller.
      */
     private OptimizedMarshaller marshaller() {
-        U.clearClassCache();
+        ClassLoaderUtils.clearClassCache();
 
         OptimizedMarshaller marsh = Marshallers.optimized();
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectStreamSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectStreamSelfTest.java
index 67695c9ee51..b34517f6de1 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectStreamSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/marshaller/optimized/OptimizedObjectStreamSelfTest.java
@@ -1194,7 +1194,7 @@ public class OptimizedObjectStreamSelfTest extends 
GridCommonAbstractTest {
 
             in = reg.in();
 
-            in.context(clsMap, CTX, null, getClass().getClassLoader(), true);
+            in.context(clsMap, CTX, null, getClass().getClassLoader());
 
             in.in().bytes(arr, arr.length);
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/p2p/P2PScanQueryUndeployTest.java
 
b/modules/core/src/test/java/org/apache/ignite/p2p/P2PScanQueryUndeployTest.java
index 708dac51081..d6bc7cb3d3c 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/p2p/P2PScanQueryUndeployTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/p2p/P2PScanQueryUndeployTest.java
@@ -33,7 +33,7 @@ import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.managers.communication.GridIoMessage;
 import org.apache.ignite.internal.managers.deployment.GridDeploymentRequest;
-import org.apache.ignite.internal.util.CommonUtils;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiPredicate;
 import org.apache.ignite.lang.IgniteInClosure;
@@ -165,7 +165,7 @@ public class P2PScanQueryUndeployTest extends 
GridCommonAbstractTest {
      * @throws Exception if something wrong.
      */
     private Set<String> igniteUtilsCachedClasses() throws Exception {
-        Field f = CommonUtils.class.getDeclaredField("classCache");
+        Field f = ClassLoaderUtils.class.getDeclaredField("classCache");
 
         f.setAccessible(true);
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeCompatibilityTest.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeCompatibilityTest.java
index 9bd2d1919a1..4c428f8d05e 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeCompatibilityTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeCompatibilityTest.java
@@ -19,6 +19,7 @@ package org.apache.ignite.spi.discovery;
 
 import java.util.HashMap;
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.marshaller.optimized.OptimizedMarshaller;
 import org.apache.ignite.internal.processors.cache.CacheMetricsSnapshot;
 import org.apache.ignite.internal.processors.cluster.CacheMetricsMessage;
@@ -81,7 +82,7 @@ public class ClusterMetricsSnapshotSerializeCompatibilityTest 
extends GridCommon
      * @return Marshaller.
      */
     private OptimizedMarshaller marshaller() {
-        U.clearClassCache();
+        ClassLoaderUtils.clearClassCache();
 
         OptimizedMarshaller marsh = Marshallers.optimized();
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerUnmarshalVulnerabilityTest.java
 
b/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerUnmarshalVulnerabilityTest.java
index d34fd0b4aca..7dcae71df3d 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerUnmarshalVulnerabilityTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/stream/socket/SocketStreamerUnmarshalVulnerabilityTest.java
@@ -53,7 +53,23 @@ import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_MARSHALLER_WHITELI
  */
 public abstract class SocketStreamerUnmarshalVulnerabilityTest extends 
GridCommonAbstractTest {
     /** */
-    public static final String EXPLOIT_CACHE = "exploit-cache";
+    static final String EXPLOIT_CACHE = "exploit-cache";
+
+    /** */
+    static final String EXPLOIT_INCLUDED
+        = 
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_included.txt").getPath();
+
+    /** */
+    static final String EXPLOIT_WITH_JOBS_INCLUDED
+        = 
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_with_jobs_included.txt").getPath();
+
+    /** */
+    static final String EXPLOIT_EXCLUDED_JOBS_INCLUDED
+        = 
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_excluded_jobs_included.txt").getPath();
+
+    /** */
+    static final String EXPLOIT_EXCLUDED
+        = 
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_excluded.txt").getPath();
 
     /** Port. */
     private static int port;
@@ -90,8 +106,7 @@ public abstract class 
SocketStreamerUnmarshalVulnerabilityTest extends GridCommo
 
         /** {@inheritDoc} */
         @Override protected List<String> additionalRemoteJvmArgs() {
-            return Arrays.asList("-D" + IGNITE_MARSHALLER_WHITELIST +
-                "=" + 
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_included.txt").getPath());
+            return Arrays.asList("-D" + IGNITE_MARSHALLER_WHITELIST + "=" + 
EXPLOIT_WITH_JOBS_INCLUDED);
         }
     }
 
@@ -105,8 +120,7 @@ public abstract class 
SocketStreamerUnmarshalVulnerabilityTest extends GridCommo
 
         /** {@inheritDoc} */
         @Override protected List<String> additionalRemoteJvmArgs() {
-            return Arrays.asList("-D" + IGNITE_MARSHALLER_WHITELIST +
-                "=" + 
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_excluded.txt").getPath());
+            return Arrays.asList("-D" + IGNITE_MARSHALLER_WHITELIST + "=" + 
EXPLOIT_EXCLUDED_JOBS_INCLUDED);
         }
     }
 
@@ -120,8 +134,7 @@ public abstract class 
SocketStreamerUnmarshalVulnerabilityTest extends GridCommo
 
         /** {@inheritDoc} */
         @Override protected List<String> additionalRemoteJvmArgs() {
-            return Arrays.asList("-D" + IGNITE_MARSHALLER_BLACKLIST +
-                "=" + 
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_included.txt").getPath());
+            return Arrays.asList("-D" + IGNITE_MARSHALLER_BLACKLIST + "=" + 
EXPLOIT_INCLUDED);
         }
     }
 
@@ -135,8 +148,7 @@ public abstract class 
SocketStreamerUnmarshalVulnerabilityTest extends GridCommo
 
         /** {@inheritDoc} */
         @Override protected List<String> additionalRemoteJvmArgs() {
-            return Arrays.asList("-D" + IGNITE_MARSHALLER_BLACKLIST +
-                "=" + 
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_excluded.txt").getPath());
+            return Arrays.asList("-D" + IGNITE_MARSHALLER_BLACKLIST + "=" + 
EXPLOIT_EXCLUDED);
         }
     }
 
@@ -150,11 +162,9 @@ public abstract class 
SocketStreamerUnmarshalVulnerabilityTest extends GridCommo
 
         /** {@inheritDoc} */
         @Override protected List<String> additionalRemoteJvmArgs() {
-            String path = 
U.resolveIgnitePath("modules/core/src/test/config/class_list_exploit_included.txt").getPath();
-
             return Arrays.asList(
-                "-D" + IGNITE_MARSHALLER_BLACKLIST + "=" + path,
-                "-D" + IGNITE_MARSHALLER_WHITELIST + "=" + path
+                "-D" + IGNITE_MARSHALLER_BLACKLIST + "=" + EXPLOIT_INCLUDED,
+                "-D" + IGNITE_MARSHALLER_WHITELIST + "=" + 
EXPLOIT_WITH_JOBS_INCLUDED
             );
         }
     }
@@ -189,7 +199,6 @@ public abstract class 
SocketStreamerUnmarshalVulnerabilityTest extends GridCommo
                     return true;
                 }
                 catch (IOException | IgniteCheckedException e) {
-                    e.printStackTrace();
                     return false;
                 }
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
 
b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
index c214494931a..f6e1f1eb677 100755
--- 
a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
@@ -85,6 +85,7 @@ import org.apache.ignite.internal.IgnitionEx;
 import org.apache.ignite.internal.binary.BinaryMarshaller;
 import org.apache.ignite.internal.binary.BinaryUtils;
 import org.apache.ignite.internal.managers.systemview.JmxSystemViewExporterSpi;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.CacheGroupContext;
 import 
org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree;
@@ -2236,7 +2237,7 @@ public abstract class GridAbstractTest extends 
JUnitAssertAware {
 
         // Remove resources cached in static, if any.
         GridClassLoaderCache.clear();
-        U.clearClassCache();
+        ClassLoaderUtils.clearClassCache();
         MarshallerExclusions.clearCache();
         BinaryUtils.clearCache();
         serializedObj.clear();
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java
index dbc06337467..3913c1d37d3 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java
@@ -30,6 +30,7 @@ import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.IgniteSystemProperties;
 import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.binary.BinaryObjectBuilder;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode;
 import org.apache.ignite.internal.processors.query.GridQueryProperty;
@@ -647,7 +648,7 @@ public final class UpdatePlanBuilder {
         final String typeName = key ? desc.keyTypeName() : 
desc.valueTypeName();
 
         //Try to find class for the key locally.
-        final Class<?> cls = key ? 
U.firstNotNull(U.classForName(desc.keyTypeName(), null), desc.keyClass())
+        final Class<?> cls = key ? 
U.firstNotNull(ClassLoaderUtils.classForName(desc.keyTypeName()), 
desc.keyClass())
             : desc.valueClass();
 
         boolean isSqlType = QueryUtils.isSqlType(cls);
diff --git 
a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
 
b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
index c91ed3ec587..ad028871809 100644
--- 
a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
+++ 
b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
@@ -48,6 +48,7 @@ import org.apache.ignite.cluster.ClusterState;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.jackson.IgniteBinaryObjectJsonDeserializer;
 import org.apache.ignite.internal.jackson.IgniteObjectMapper;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.cache.CacheConfigurationOverride;
 import org.apache.ignite.internal.processors.rest.GridRestCommand;
 import org.apache.ignite.internal.processors.rest.GridRestProtocolHandler;
@@ -1026,7 +1027,7 @@ public class GridJettyRestHandler extends HttpServlet {
                 }
 
                 // Creating an object of the specified type, if its class is 
available.
-                Class<?> cls = U.classForName(type, null);
+                Class<?> cls = ClassLoaderUtils.classForName(type);
 
                 if (cls != null)
                     return jsonMapper.readValue(str, cls);
diff --git 
a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
 
b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
index a7d06a8be4d..2db974818cc 100644
--- 
a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
+++ 
b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java
@@ -69,9 +69,9 @@ import 
org.apache.ignite.internal.binary.streams.BinaryInputStream;
 import org.apache.ignite.internal.binary.streams.BinaryOutputStream;
 import 
org.apache.ignite.internal.client.thin.TcpClientTransactions.TcpClientTransaction;
 import org.apache.ignite.internal.client.thin.io.ClientConnectionMultiplexer;
+import org.apache.ignite.internal.marshaller.ClassLoaderUtils;
 import org.apache.ignite.internal.processors.platform.client.ClientStatus;
 import 
org.apache.ignite.internal.processors.platform.client.IgniteClientException;
-import org.apache.ignite.internal.util.CommonUtils;
 import org.apache.ignite.internal.util.GridArgumentCheck;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.logger.NullLogger;
@@ -860,8 +860,7 @@ public class TcpIgniteClient implements IgniteClient {
         @Override public Class getClass(int typeId, ClassLoader ldr)
             throws ClassNotFoundException, IgniteCheckedException {
 
-            return 
CommonUtils.forName(getClassName(MarshallerPlatformIds.JAVA_ID, typeId), ldr, 
null,
-                Marshallers.USE_CACHE.get());
+            return 
ClassLoaderUtils.forName(getClassName(MarshallerPlatformIds.JAVA_ID, typeId), 
ldr);
         }
 
         /** {@inheritDoc} */

Reply via email to