@Override
 public ReferenceProperty findReferenceType(AnnotatedMember member) {
   JsonManagedReference ref1 = _findAnnotation(member, JsonManagedReference.class);
   if (ref1 != null) {
     return AnnotationIntrospector.ReferenceProperty.managed(ref1.value());
   }
   JsonBackReference ref2 = _findAnnotation(member, JsonBackReference.class);
   if (ref2 != null) {
     return AnnotationIntrospector.ReferenceProperty.back(ref2.value());
   }
   return null;
 }
  /**
   * Method that will construct a regular bean property setter using the given setter method.
   *
   * @return Property constructed, if any; or null to indicate that there should be no property
   *     based on given definitions.
   */
  protected SettableBeanProperty constructSettableProperty(
      DeserializationContext ctxt,
      BeanDescription beanDesc,
      BeanPropertyDefinition propDef,
      Type jdkType)
      throws JsonMappingException {
    // need to ensure method is callable (for non-public)
    AnnotatedMember mutator = propDef.getMutator();
    if (ctxt.canOverrideAccessModifiers()) {
      mutator.fixAccess();
    }
    // note: this works since we know there's exactly one argument for methods
    JavaType t0 = beanDesc.resolveType(jdkType);

    BeanProperty.Std property =
        new BeanProperty.Std(propDef.getName(), t0, beanDesc.getClassAnnotations(), mutator);
    JavaType type = resolveType(ctxt, beanDesc, t0, mutator);
    // did type change?
    if (type != t0) {
      property = property.withType(type);
    }

    /* First: does the Method specify the deserializer to use?
     * If so, let's use it.
     */
    JsonDeserializer<Object> propDeser = findDeserializerFromAnnotation(ctxt, mutator);
    type = modifyTypeByAnnotation(ctxt, mutator, type);
    TypeDeserializer typeDeser = type.getTypeHandler();
    SettableBeanProperty prop;
    if (mutator instanceof AnnotatedMethod) {
      prop =
          new MethodProperty(
              propDef, type, typeDeser, beanDesc.getClassAnnotations(), (AnnotatedMethod) mutator);
    } else {
      prop =
          new FieldProperty(
              propDef, type, typeDeser, beanDesc.getClassAnnotations(), (AnnotatedField) mutator);
    }
    if (propDeser != null) {
      prop = prop.withValueDeserializer(propDeser);
    }
    // [JACKSON-235]: need to retain name of managed forward references:
    AnnotationIntrospector.ReferenceProperty ref = propDef.findReferenceType();
    if (ref != null && ref.isManagedReference()) {
      prop.setManagedReferenceName(ref.getName());
    }
    return prop;
  }
 /**
  * Method for locating all back-reference properties (setters, fields) bean has
  *
  * @since 1.6
  */
 public Map<String, AnnotatedMember> findBackReferenceProperties() {
   HashMap<String, AnnotatedMember> result = null;
   for (BeanPropertyDefinition property : _properties) {
     AnnotatedMember am = property.getMutator();
     if (am == null) {
       continue;
     }
     AnnotationIntrospector.ReferenceProperty refDef =
         _annotationIntrospector.findReferenceType(am);
     if (refDef != null && refDef.isBackReference()) {
       if (result == null) {
         result = new HashMap<String, AnnotatedMember>();
       }
       String refName = refDef.getName();
       if (result.put(refName, am) != null) {
         throw new IllegalArgumentException(
             "Multiple back-reference properties with name '" + refName + "'");
       }
     }
   }
   return result;
 }