private String getMethodDescr(final Object value, boolean isArray) {
      final StringBuilder descriptor = new StringBuilder();
      descriptor.append("()");
      if (isArray) {
        descriptor.append("[");
      }
      if (value instanceof Type) {
        descriptor.append("Ljava/lang/Class;");
      }
      else {
        final String name = Type.getType(value.getClass()).getInternalName();
        // only primitive, String, Class, Enum, another Annotation or array of any of these are allowed
        switch (name) {
          case "java/lang/Integer":
            descriptor.append("I");
            break;
          case "java/lang/Short":
            descriptor.append("S");
            break;
          case "java/lang/Long":
            descriptor.append("J");
            break;
          case "java/lang/Byte":
            descriptor.append("B");
            break;
          case "java/lang/Char":
            descriptor.append("C");
            break;
          case "java/lang/Boolean":
            descriptor.append("Z");
            break;
          case "java/lang/Float":
            descriptor.append("F");
            break;
          case "java/lang/Double":
            descriptor.append("D");
            break;
          default:
            descriptor.append("L").append(name).append(";");
            break;
        }
      }
      return descriptor.toString();
    }
private String getMethodDescr(final Object value, boolean isArray)