docs: @Override
      public void visitJavaClass(JavaClass obj) {
          setupVisitorForClass(obj);
          if (shouldVisit(obj)) {
              constantPool.accept(this);
              Field[] fields = obj.getFields();
              Attribute[] attributes = obj.getAttributes();
              for (Field field : fields) {
                  doVisitField(field);
              }
              boolean didInCallOrder = false;
  
              if (visitMethodsInCallOrder) {
                  try {
                      IAnalysisCache analysisCache = Global.getAnalysisCache();
  
                      ClassDescriptor c = DescriptorFactory.createClassDescriptor(obj);
  
                      ClassContext classContext = analysisCache.getClassAnalysis(ClassContext.class, c);
                      didInCallOrder = true;
                      for (Method m : classContext.getMethodsInCallOrder()) {
                          doVisitMethod(m);
                      }
  
                  } catch (CheckedAnalysisException e) {
                      AnalysisContext.logError("Error trying to visit methods in order", e);
                  }
              }
              if (!didInCallOrder) {
                  for (Method m : getMethodVisitOrder(obj)) {
                      doVisitMethod(m);
                  }
              }
              for (Attribute attribute : attributes) {
                  attribute.accept(this);
              }
              visitAfter(obj);
          }
      }