code: public static Set<String> getFieldsName(Object instance, Runnable fieldsMarker) {
      JsPropertyMap<Any> map = cast(instance);
      JsObject jsObject = cast(instance);
      map.forEach(key -> {
        if (!jsObject.hasOwnProperty(key)) {
          return;
        }
  
        try {
          Any val = asAny(map.get(key));
          if (isTripleEqual(val, null) ||
              isTripleEqual(val, asAny(1)) ||
              isTripleEqual(val, asAny(true))) {
            map.delete(key);
          }
        } catch (Exception e) {
  
        }
      });
  
      fieldsMarker.run();
  
      Set<String> dataFields = new HashSet<>();
      map.forEach(key -> {
        if (!jsObject.hasOwnProperty(key)) {
          return;
        }
  
        try {
          Any val = asAny(map.get(key));
          if (isTripleEqual(val, null) ||
              isTripleEqual(val, asAny(1)) ||
              isTripleEqual(val, asAny(true))) {
            dataFields.add(key);
          }
        } catch (Exception e) {
  
        }
      });
  
      return dataFields;
    }
docs: Determine the name of fields at runtime. This allows fields to be renamed during optimizations.
  The fieldsMarker method must set the value of the wanted fields to either null, 0 or false
  (depending on the type of the field).
  
  @param instance The instance we want to get the name of the fields from
  @param fieldsMarker Mark the fields which names we want to get
  @return The list of names of the fields