pinpoint-apm/pinpoint · error · IllegalArgumentException

different return type. return=

Error message

different return type. return=${fieldType}, field=${fieldJavaType}

What it means

Thrown inside ASMClass.addGetter: the field exists but its type differs from the getter method's analyzed return type (GetterAnalyzer), so generating the getter would produce a type-inconsistent accessor.

Solutions

  1. Make the getter interface's return type exactly match the target field's type
  2. Check for autoboxing/primitive mismatches between getter and field
  3. Correct the getter class used in the plugin configuration
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMClass.java:306 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of pinpoint-apm/pinpoint@744c3d3075 (2026-09-07). Data as JSON: /api/errors/10b9332bc4b99aee. Report an issue: GitHub.

Appendix: source

Thrown at agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/ASMClass.java:306

        } catch (Exception e) {
            throw new InstrumentException("Failed to add field with accessor [" + accessorClass.getName() + "]. Cause:" + e.getMessage(), e);
        }
    }

    @Override
    public void addGetter(Class<?> getterClass, String fieldName) throws InstrumentException {
        Objects.requireNonNull(getterClass, "getterClass");
        Objects.requireNonNull(fieldName, "fieldName");

        try {
            final GetterAnalyzer.GetterDetails getterDetails = GetterAnalyzer.instance().analyze(getterClass);
            final ASMFieldNodeAdapter fieldNode = this.classNode.getField(fieldName, null);
            if (fieldNode == null) {
                throw new IllegalArgumentException("Not found field. name=" + fieldName);
            }
            Type fieldType = getterDetails.getFieldType();
            if (!fieldNode.getJavaType().equals(fieldType)) {
                throw new IllegalArgumentException("different return type. return=" + fieldType + ", field=" + fieldNode.getJavaType());
            }

            boolean modified = this.classNode.addGetterMethod(getterDetails.getGetter().getName(), fieldNode);
            modified |= this.classNode.addInterface(getterClass.getName());
            if (modified) {
                setModified(true);
            } else if (logger.isDebugEnabled()) {
                logger.debug("Skip addGetter, getter already declared. class={}, getter={}", getName(), getterClass.getName());
            }
        } catch (Exception e) {
            throw new InstrumentException("Failed to add getter: " + getterClass.getName(), e);
        }
    }

    @Override
    public void addSetter(Class<?> setterClass, String fieldName) throws InstrumentException {
        this.addSetter(setterClass, fieldName, false);
    }

View on GitHub (pinned to 744c3d3075)