{"record":{"id":"268c6adaef8d681f","repo":"pinpoint-apm/pinpoint","slug":"invalid-type","errorCode":null,"errorMessage":"invalid Type","messagePattern":"invalid Type","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/interceptor/InterceptorDefinitionFactory.java","lineNumber":118,"sourceCode":"        addTypeHandler(typeHandlerList, BlockAroundInterceptor5.class, InterceptorType.BASIC);\n        addTypeHandler(typeHandlerList, BlockStaticAroundInterceptor.class, InterceptorType.STATIC);\n        addTypeHandler(typeHandlerList, BlockApiIdAwareAroundInterceptor.class, InterceptorType.API_ID_AWARE);\n\n        return typeHandlerList;\n    }\n\n    private void addTypeHandler(List<TypeHandler> typeHandlerList, Class<? extends Interceptor> interceptorClazz, InterceptorType arrayArgs) {\n        final TypeHandler typeHandler = createInterceptorTypeHandler(interceptorClazz, arrayArgs);\n        typeHandlerList.add(typeHandler);\n    }\n\n    private TypeHandler createInterceptorTypeHandler(Class<? extends Interceptor> interceptorClazz, InterceptorType interceptorType) {\n        Objects.requireNonNull(interceptorClazz, \"interceptorClazz\");\n        Objects.requireNonNull(interceptorType, \"interceptorType\");\n\n        final Method[] declaredMethods = interceptorClazz.getDeclaredMethods();\n        if (declaredMethods.length != 2) {\n            throw new RuntimeException(\"invalid Type\");\n        }\n        final String before = \"before\";\n        final Method beforeMethod = findMethodByName(declaredMethods, before);\n        final Class<?>[] beforeParamList = beforeMethod.getParameterTypes();\n\n        final String after = \"after\";\n        final Method afterMethod = findMethodByName(declaredMethods, after);\n        final Class<?>[] afterParamList = afterMethod.getParameterTypes();\n\n        return new TypeHandler(interceptorClazz, interceptorType, before, beforeParamList, after, afterParamList);\n    }\n\n\n    private Method findMethodByName(Method[] declaredMethods, String methodName) {\n        Method findMethod = null;\n        int count = 0;\n        for (Method method : declaredMethods) {\n            if (method.getName().equals(methodName)) {","sourceCodeStart":100,"sourceCodeEnd":136,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/interceptor/InterceptorDefinitionFactory.java#L100-L136","documentation":"RuntimeException(\"invalid Type\") thrown by InterceptorDefinitionFactory.createInterceptorTypeHandler when an interceptor class does not declare exactly 2 methods. Pinpoint's interceptor contract requires exactly one before() and one after() method; any other method count (0, 1, or 3+, including bridge/synthetic methods) fails this invariant.","triggerScenarios":"createInterceptorTypeHandler invoked with an interceptor class whose getDeclaredMethods().length != 2 - e.g. a class with extra helper methods, abstract methods, or a base class adding methods.","commonSituations":"Adding a private helper or an extra overload to an interceptor class, extending another interceptor class and inheriting extra declared methods, or declaring toString/equals-style methods alongside before/after (getDeclaredMethods excludes inherited but includes everything declared locally).","solutions":["Ensure the interceptor class declares exactly two methods: one before(...) and one after(...).","Move any helper logic into a separate utility class or inline it.","If you need shared code, use composition with a separate delegate object rather than extra declared methods.","Check for compiler-generated methods (e.g. overloads) and remove them."],"exampleFix":"// before\nclass MyInterceptor implements Interceptor {\n    public void before(Object t, Object[] a) { helper(); }\n    public void after(Object t, Object r, Throwable th) { }\n    private void helper() { } // extra declared method -> invalid Type\n}\n// after\nclass MyInterceptor implements Interceptor {\n    public void before(Object t, Object[] a) { /* inline helper */ }\n    public void after(Object t, Object r, Throwable th) { }\n}","handlingStrategy":"validation","validationCode":"if (interceptorClazz.getDeclaredMethods().length != 2) {\n    throw new IllegalArgumentException(interceptorClazz + \" must declare exactly before() and after()\");\n}","typeGuard":null,"tryCatchPattern":"try { factory.createInterceptorDefinition(clazz); } catch (RuntimeException e) { if (\"invalid Type\".equals(e.getMessage())) { /* inspect getDeclaredMethods() and remove extras */ } throw e; }","preventionTips":["Never add helper methods to interceptor classes","Use composition for shared logic","Add a build-time check that every interceptor has exactly two declared methods"],"tags":["interceptor","instrumentation","pinpoint","contract-violation"],"backgroundTag":"invalid-interceptor-contract","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"}