static ClassInfo fromClass(Class<?> klass) {
            return CACHE.getForClass(klass, klass, () -> {
                ClassInfo info = new ClassInfo();
                Set<String> transientFields = getTransientFields(klass);
                // Determine which methods are getters that aren't backed by transient properties.
                for (Method method : klass.getMethods()) {
                    // Ignore Object.class, getSourceLocation, etc.
                    if (isIgnoredMethod(klass, method)) {
                        continue;
                    }
                    int fieldPrefixChars = getGetterPrefixCharCount(method);
                    // If the method starts with the parsed prefix characters, then check if it's transient.
                    if (fieldPrefixChars > 0 && fieldPrefixChars != method.getName().length()) {
                        // Always normalize as the lowercase name (i.e., "getFoo" -> "foo").
                        String lowerFieldName = StringUtils.uncapitalize(method.getName().substring(fieldPrefixChars));
                        if (!transientFields.contains(lowerFieldName)) {
                            info.getters.put(lowerFieldName, method);
                        } else {
                            LOGGER.fine(klass.getName() + " getter " + method.getName() + " is transient");
                        }
                    }
                }
                LOGGER.fine(() -> "Detected the following getters for " + klass.getName() + ": " + info.getters);
                return info;
            });
        }
Contains the getters of a class that are eligible to convert to a Node.

<p>Getters are public methods that take zero arguments and start with
"get" or "is". Getters that are associated with properties marked as
{@code transient} are not serialized.
smithy-model/src/main/java/software/amazon/smithy/model/node/DefaultNodeSerializers.java