code: public <H extends Annotation> void scanForAnnotation(
        Class<H> expectedAnnotation, Listener<T, H> listener) {
      BeanInfo beanInfo;
      try {
        beanInfo = Introspector.getBeanInfo(beanType);
      } catch (IntrospectionException e) {
        throw new RuntimeException("Can't get bean info of " + beanType);
      }
      for (PropertyDescriptor desc : beanInfo.getPropertyDescriptors()) {
        AccessibleObject access = findAnnotatedAccess(desc, expectedAnnotation);
        if (access == null) {
          continue;
        }
        ValueReference<T> reference;
        if (access instanceof Field) {
          reference = ValueReference.instanceOf((Field) access);
        } else {
          reference = ValueReference.instanceOf(desc);
        }
        listener.handleReference(reference, access.getAnnotation(expectedAnnotation), access);
      }
      for (Field field : beanType.getFields()) {
        H annotation = field.getAnnotation(expectedAnnotation);
        if (annotation == null) {
          continue;
        }
        ValueReference<T> reference = ValueReference.instanceOf(field);
        listener.handleReference(reference, annotation, field);
      }
    }
docs: Scan given class and look for possible references annotated by given annotation
  
  @param <H> Only field or method annotated with this annotation is inspected
  @param expectedAnnotation Only field or method annotated with this annotation is inspected
  @param listener Listener to handle found references