pinpoint-apm/pinpoint · error · InstrumentException
not found interceptorHolderClass, className=
Error message
not found interceptorHolderClass, className=
What it means
ASMInterceptorHolder.loadInterceptorClass() loads the interceptor holder class and calls its static get() method. If loadClass() returns null despite being a 'defense code' path, it throws InstrumentException 'not found interceptorHolderClass, className=...'. This means the holder class could not be resolved in the given classloader.
Source
Thrown at agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMInterceptorHolder.java:91
this.interceptorId = interceptorId;
this.className = CLASS_NAME + interceptorId;
this.innerClassName = className + "$LazyLoading";
}
public int getInterceptorId() {
return interceptorId;
}
public String getClassName() {
return className;
}
public Class<? extends Interceptor> loadInterceptorClass(ClassLoader classLoader) throws InstrumentException {
try {
final Class<?> clazz = loadClass(classLoader);
if (clazz == null) {
// defense code
throw new InstrumentException("not found interceptorHolderClass, className=" + className);
}
final Method method = clazz.getDeclaredMethod("get");
final Object o = method.invoke(null);
if (o instanceof Interceptor) {
return (Class<? extends Interceptor>) o.getClass();
} else {
throw new InstrumentException("not found interceptor, className=" + className);
}
} catch (InvocationTargetException e) {
throw new InstrumentException("invocation fail, className=" + className, e);
} catch (NoSuchMethodException e) {
throw new InstrumentException("not found 'get' method, className=" + className, e);
} catch (IllegalAccessException e) {
throw new InstrumentException("access fail, className=" + className, e);
}
}
View on GitHub (pinned to 744c3d3075)
Solutions
- Verify the holder class exists in the plugin jar and the className is correct
- Check classloader visibility of the holder class in the target application
- Redeploy the plugin jar to the agent plugin directory
- Read the underlying cause from loadClass to distinguish not-found vs linkage errors
Defensive patterns
Strategy: try-catch
Validate before calling
try {
Class<?> holder = Class.forName(className, false, classLoader);
if (holder == null) { /* not loadable */ }
} catch (ClassNotFoundException e) { /* fix packaging */ } Try / catch
try {
Class<? extends Interceptor> c = holder.interceptorClass(classLoader);
} catch (InstrumentException e) {
logger.warn("holder {} not loadable: {}", className, e.getMessage());
} Prevention
- Package holder classes in the plugin jar
- Use constants for holder class names
- Test classloading in an environment mirroring production classloader layout
When it happens
Trigger: Calling interceptorClass()/loadInterceptorClass(classLoader) where loadClass(classLoader) returns null for the holder className; class not loadable in the target classloader.
Common situations: Holder class not packaged or not visible to the application classloader; typo in className; plugin jar missing from the agent's plugin directory.
Related errors
- not found interceptor, className=
- ${interceptorClassName} not found Caused by:${ex.getMessage(
- ${after} method not found. ${Arrays.toString(afterParamList)
- ${after} must return java.lang.Object. ${targetInterceptorCl
- ${before} not allowed return. ${Arrays.toString(beforeParamL
AI-assisted analysis of pinpoint-apm/pinpoint@744c3d3075 (2026-09-07).
Data as JSON: /api/errors/6f3983c0395fab66.
Report an issue: GitHub.