{"record":{"id":"3d6f4a4de3f9e190","repo":"pinpoint-apm/pinpoint","slug":"target-class-is-not-modifiable","errorCode":null,"errorMessage":"Target class  is not modifiable","messagePattern":"Target class  is not modifiable","errorType":"exception","errorClass":"ProfilerException","httpStatus":null,"severity":"error","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/transformer/DynamicTransformService.java","lineNumber":81,"sourceCode":"        } finally {\n            if (!success) {\n                requestHandle.cancel();\n            }\n        }\n    }\n\n    @Override\n    public void addClassFileTransformer(ClassLoader classLoader, String targetClassName, ClassFileTransformer transformer) {\n        if (this.logger.isDebugEnabled()) {\n            logger.debug(\"Add dynamic transform. classLoader={}, class={}\", classLoader, targetClassName);\n        }\n\n        this.dynamicTransformRequestListener.onTransformRequest(classLoader, targetClassName, transformer);\n    }\n\n    private void assertClass(Class<?> target) {\n        if (!instrumentation.isModifiableClass(target)) {\n            throw new ProfilerException(\"Target class \" + target + \" is not modifiable\");\n        }\n        final JvmVersion version = JvmUtils.getVersion();\n        if (JAVA_8.compareTo(version) == 0) {\n            // If the version is java 8\n            // Java 8 bug - NoClassDefFound error in transforming lambdas(https://bugs.openjdk.java.net/browse/JDK-8145964)\n            final String className = target.getName();\n            if (className != null && className.contains(\"$$Lambda$\")) {\n                throw new ProfilerException(\"Target class \" + target + \" is lambda class, Causes NoClassDefFound error in java 8.\");\n            }\n        }\n    }\n\n    private void triggerRetransform(Class<?> target) {\n        try {\n            instrumentation.retransformClasses(target);\n        } catch (UnmodifiableClassException e) {\n            throw new ProfilerException(e);\n        }","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/transformer/DynamicTransformService.java#L63-L99","documentation":"DynamicTransformService.retransform() first asserts via instrumentation.isModifiableClass() that the JVM allows retransforming the target class. Classes loaded without retention of bytecode needed for retransformation, or classes the JVM refuses (e.g. some bootstrap/generated classes), cannot be modified, so the agent throws ProfilerException.","triggerScenarios":"Calling dynamicTransformService.retransform(Class) on a class for which Instrumentation.isModifiableClass() returns false, e.g. classes already transformed by another agent without retransformation support, or non-modifiable JVM classes.","commonSituations":"Trying to hot-apply Pinpoint transformers to classes loaded before the agent with unsupported bytecode versions; instrumenting generated/proxy classes; attaching agent to an already heavily-instrumented JVM.","solutions":["Verify with instrumentation.isModifiableClass(target) before calling retransform and skip/log instead","Ensure the class bytecode version and classloader are supported by the JVM for retransformation","Retransform only classes that were loaded normally and not stripped by another agent","Upgrade the JVM if a known class-modifiability bug applies"],"exampleFix":"// before\ntransformService.retransform(clazz); // throws if not modifiable\n// after\nif (instrumentation.isModifiableClass(clazz)) {\n    transformService.retransform(clazz);\n} else {\n    logger.warn(\"Skip retransform, not modifiable: {}\", clazz.getName());\n}","handlingStrategy":"validation","validationCode":"if (!instrumentation.isModifiableClass(target)) { skipRetransform(target); return; }","typeGuard":"boolean canRetransform(Class<?> c) { return instrumentation != null && instrumentation.isModifiableClass(c); }","tryCatchPattern":"try { transformService.retransform(clazz); } catch (ProfilerException e) { logger.warn(\"Cannot retransform {}: {}\", clazz.getName(), e.getMessage()); }","preventionTips":["Always check isModifiableClass before dynamic retransform","Avoid targeting classes produced by other instrumentation agents","Test dynamic transforms on the target JVM version"],"tags":["java","instrumentation","retransform","jvm"],"backgroundTag":"unsupported-operation","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}