static @NotNull FieldData read(@NotNull ClassReader classReader) {
      Set<Member> staticFields = new HashSet<>();
      Set<Member> volatileFields = new HashSet<>();
      classReader.accept(new ClassVisitor(Opcodes.API_VERSION) {
        @Override
        public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
          int modifiers = Opcodes.ACC_STATIC | Opcodes.ACC_FINAL;
          if ((access & modifiers) == modifiers && (access & (Opcodes.ACC_ENUM | Opcodes.ACC_SYNTHETIC)) == 0 &&
              (desc.startsWith("L") || desc.startsWith("["))) {
            staticFields.add(new Member(classReader.getClassName(), name, desc));
          }
          if ((access & Opcodes.ACC_VOLATILE) != 0) {
            volatileFields.add(new Member(classReader.getClassName(), name, desc));
          }
          return null;
        }
      }, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG | ClassReader.SKIP_CODE);
      return new FieldData(staticFields, volatileFields);
    }
static @NotNull FieldData read(@NotNull ClassReader classReader)