{"record":{"id":"cd9ebc89473e4193","repo":"apache/pulsar","slug":"classnotfoundexception-classname","errorCode":null,"errorMessage":"ClassNotFoundException: className","messagePattern":"ClassNotFoundException: className","errorType":"exception","errorClass":"ClassNotFoundException","httpStatus":null,"severity":"error","filePath":"pulsar-common/src/main/java/org/apache/pulsar/common/util/Reflections.java","lineNumber":304,"sourceCode":"                return Byte.TYPE;\n            } else if (type == 'C') {\n                return Character.TYPE;\n            } else if (type == 'D') {\n                return Double.TYPE;\n            } else if (type == 'F') {\n                return Float.TYPE;\n            } else if (type == 'I') {\n                return Integer.TYPE;\n            } else if (type == 'J') {\n                return Long.TYPE;\n            } else if (type == 'S') {\n                return Short.TYPE;\n            } else if (type == 'Z') {\n                return Boolean.TYPE;\n            } else if (type == 'V') {\n                return Void.TYPE;\n            } else {\n                throw new ClassNotFoundException(className);\n            }\n        } else if (isPrimitive(className)) {\n            return PRIMITIVE_NAME_TYPE_MAP.get(className);\n        } else if (className.charAt(0) == 'L' && className.charAt(className.length() - 1) == ';') {\n            return classLoader.loadClass(className.substring(1, className.length() - 1));\n        } else {\n            try {\n                return classLoader.loadClass(className);\n            } catch (ClassNotFoundException | NoClassDefFoundError var4) {\n                if (className.charAt(0) != '[') {\n                    throw var4;\n                } else {\n                    // CHECKSTYLE.OFF: EmptyStatement\n                    int arrayDimension;\n                    for (arrayDimension = 0; className.charAt(arrayDimension) == '['; ++arrayDimension) {\n                    }\n                    // CHECKSTYLE.ON: EmptyStatement\n","sourceCodeStart":286,"sourceCodeEnd":322,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-common/src/main/java/org/apache/pulsar/common/util/Reflections.java#L286-L322","documentation":"Reflections.loadClass supports JVM field-type descriptors: primitive letters (B,C,D,F,I,J,S,Z,V), 'L<ClassName>;' for objects, and plain names. If className is a single unrecognized character that isn't a known primitive descriptor code, it throws ClassNotFoundException. This happens while parsing descriptor strings, not ordinary dotted class names.","triggerScenarios":"Calling Reflections.loadClass(classLoader, className) with a one-character string that is not a valid primitive descriptor (e.g. 'X', 'A'), or a malformed descriptor string where the first char is taken as a type code.","commonSituations":"Parsing a JNI/method descriptor and encountering a type char that isn't supported; typo where only a single letter was passed instead of a full class name; unsupported descriptor like array type '[' prefix or generics leaking into the descriptor.","solutions":["Pass the full dotted class name (e.g. 'java.lang.String') or a correct descriptor: 'Ljava.lang.String;' for objects.","Use a supported primitive code: B C D F I J S Z, or V for void.","Pre-strip array brackets ('[') or handle them before calling loadClass.","Log/inspect the className value at the call site — a single unexpected character usually means a malformed descriptor upstream."],"exampleFix":"// before\nloadClass(cl, \"K\");\n// after\nloadClass(cl, \"I\"); // or loadClass(cl, \"com.example.MyClass\");","handlingStrategy":"validation","validationCode":"static final Set<Character> PRIMITIVES = Set.of('B','C','D','F','I','J','S','Z','V');\nstatic boolean isSupportedTypeRef(String className) {\n    if (className == null || className.isEmpty()) return false;\n    if (className.length() == 1) return PRIMITIVES.contains(className.charAt(0));\n    if (className.startsWith(\"L\") && className.endsWith(\";\")) return true;\n    return className.indexOf('.') > 0; // ordinary dotted name\n}","typeGuard":"static boolean isPrimitiveDescriptor(String s) {\n    return s != null && s.length() == 1 && \"BCDFIJSZV\".indexOf(s.charAt(0)) >= 0;\n}","tryCatchPattern":"try { return Reflections.loadClass(classLoader, className); }\ncatch (ClassNotFoundException e) {\n    if (className.length() == 1)\n        throw new IllegalArgumentException(\"Unrecognized type descriptor '\" + className\n            + \"'; use B C D F I J S Z V, 'L...;' or a dotted class name\", e);\n    throw e;\n}","preventionTips":["Only pass descriptor strings that match the supported grammar (primitives, L...;, dotted names)","Strip array prefixes '[' and generics before calling loadClass","Unit-test descriptor parsing with every type code your code can produce","Default unknown single-character inputs to a clear error instead of passing them through"],"tags":["reflection","classloading","descriptor"],"backgroundTag":"classnotfound-exception","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}