@Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        ReflectionMethodDescriptor that = (ReflectionMethodDescriptor) o;
        return generic == that.generic
                && Objects.equals(method, that.method)
                && Objects.equals(paramDesc, that.paramDesc)
                && Arrays.equals(compatibleParamSignatures, that.compatibleParamSignatures)
                && Arrays.equals(parameterClasses, that.parameterClasses)
                && Objects.equals(returnClass, that.returnClass)
                && Arrays.equals(returnTypes, that.returnTypes)
                && Objects.equals(methodName, that.methodName)
                && Objects.equals(attributeMap, that.attributeMap);
    }
@Test
    void testEquals() {
        try {
            MethodDescriptor method2 =
                    new ReflectionMethodDescriptor(DemoService.class.getDeclaredMethod("sayHello", String.class));
            method.addAttribute("attr", "attr");
            method2.addAttribute("attr", "attr");
            Assertions.assertEquals(method, method2);
        } catch (NoSuchMethodException e) {
            throw new IllegalStateException(e);
        }
    }