{"record":{"id":"7c60b5ae478fc3e1","repo":"pinpoint-apm/pinpoint","slug":"duplicated-method-exist-methodname-methodname","errorCode":null,"errorMessage":"duplicated method exist. methodName:${methodName}","messagePattern":"duplicated method exist\\. methodName:(.+?)","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/interceptor/InterceptorDefinitionFactory.java","lineNumber":145,"sourceCode":"\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)) {\n                count++;\n                findMethod = method;\n            }\n        }\n        if (findMethod == null) {\n            throw new RuntimeException(methodName + \" not found\");\n        }\n        if (count > 1 ) {\n            throw new RuntimeException(\"duplicated method exist. methodName:\" + methodName);\n        }\n        return findMethod;\n    }\n\n\n    private class TypeHandler {\n        private final Class<? extends Interceptor> interceptorClazz;\n        private final InterceptorType interceptorType;\n        private final String before;\n        private final Class<?>[] beforeParamList;\n        private final String after;\n        private final Class<?>[] afterParamList;\n\n        public TypeHandler(Class<? extends Interceptor> interceptorClazz, InterceptorType interceptorType, String before, final Class<?>[] beforeParamList, final String after, final Class<?>[] afterParamList) {\n            this.interceptorClazz = Objects.requireNonNull(interceptorClazz, \"interceptorClazz\");\n            this.interceptorType = Objects.requireNonNull(interceptorType, \"interceptorType\");\n            this.before = Objects.requireNonNull(before, \"before\");\n            this.beforeParamList = Objects.requireNonNull(beforeParamList, \"beforeParamList\");","sourceCodeStart":127,"sourceCodeEnd":163,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/interceptor/InterceptorDefinitionFactory.java#L127-L163","documentation":"RuntimeException(\"duplicated method exist. methodName:...\") thrown by InterceptorDefinitionFactory.findMethodByName when more than one declared method shares the target name (before or after). Pinpoint requires a single unambiguous before()/after() per interceptor class.","triggerScenarios":"The interceptor class declares two or more overloads named before or after (e.g. before(Object) and before(Object, Object[])) - getDeclaredMethods() returns both, count > 1, and the factory aborts.","commonSituations":"Adding an overload of before/after for convenience, or extending a class that declares its own before/after in addition to the subclass's (declared methods of the concrete class plus bridge methods).","solutions":["Keep exactly one before() and one after() method; remove any overloads.","Move overload dispatch logic inside the single before/after body using argument inspection.","If inheritance causes the duplicate, flatten the class so only one declaration exists in the concrete interceptor."],"exampleFix":"// before\npublic void before(Object t, Object[] a) { }\npublic void before(Object t) { } // duplicate\n// after\npublic void before(Object t, Object[] a) { /* handle both cases */ }","handlingStrategy":"validation","validationCode":"Map<String, Long> counts = Arrays.stream(clazz.getDeclaredMethods())\n    .collect(Collectors.groupingBy(Method::getName, Collectors.counting()));\nif (counts.getOrDefault(\"before\", 0L) > 1 || counts.getOrDefault(\"after\", 0L) > 1) {\n    throw new IllegalArgumentException(clazz + \" has duplicated before/after overloads\");\n}","typeGuard":null,"tryCatchPattern":"try { factory.createInterceptorDefinition(clazz); } catch (RuntimeException e) { if (e.getMessage().startsWith(\"duplicated method exist\")) { /* remove overloads */ } throw e; }","preventionTips":["No overloads of before/after in interceptor classes","Flatten inheritance so only one declaration exists","Add a unit test that builds every interceptor definition at startup"],"tags":["interceptor","reflection","pinpoint","duplicate-method"],"backgroundTag":"duplicate-method-definition","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"}