private List<DefaultOption> optionsForField(Field field) {
                // check if this is a complex configuration parameter and bail early
                var complexConfigurationParameterAnnotation = field.getAnnotation(ComplexConfigurationParameter.class);
                if (complexConfigurationParameterAnnotation != null) {
                    var prefix = complexConfigurationParameterAnnotation.prefix();
                    if (PlcConfiguration.class.isAssignableFrom(field.getType())) {
                        return getOptions((Class<? extends PlcConfiguration>) field.getType())
                            .stream()
                            .map(option -> new DefaultOption(
                                prefix + "." + option.getKey(),
                                option.getType(),
                                option.getDescription(),
                                option.isRequired(),
                                option.getDefaultValue().orElse(null),
                                option.getSince().orElse(null)
                            ))
                            .collect(Collectors.toList());
                    }
                }
                String key = null;
                var configurationParameterAnnotation = field.getAnnotation(ConfigurationParameter.class);
                if (configurationParameterAnnotation != null) {
                    key = configurationParameterAnnotation.value();
                    if (key.isEmpty()) {
                        key = field.getName();
                    }
                }
                if (key == null) {
                    return Collections.emptyList();
                }
                String description = "";
                var descriptionAnnotation = field.getAnnotation(Description.class);
                if (descriptionAnnotation != null) {
                    description = descriptionAnnotation.value();
                }
                boolean required = false;
                var requiredAnnotation = field.getAnnotation(Required.class);
                if (requiredAnnotation != null) {
                    required = true;
                }
                OptionType type;
                switch (field.getType().getSimpleName()) {
                    case "boolean":
                    case "Boolean":
                        type = OptionType.BOOLEAN;
                        break;
                    case "float":
                    case "Float":
                        type = OptionType.FLOAT;
                        break;
                    case "double":
                    case "Double":
                        type = OptionType.DOUBLE;
                        break;
                    case "int":
                    case "Integer":
                        type = OptionType.INT;
                        break;
                    case "long":
                    case "Long":
                        type = OptionType.LONG;
                        break;
                    case "String":
                        type = OptionType.STRING;
                        break;
                    default:
                        // If there's a property-converter, use "STRING" as type.
                        var parameterConverterAnnotation = field.getAnnotation(ParameterConverter.class);
                        if (parameterConverterAnnotation != null) {
                            type = OptionType.STRING;
                        } else {
                            type = OptionType.STRUCT;
                        }
                        break;
                }
                Object defaultValue = null;
                var booleanDefaultValueAnnotation = field.getAnnotation(BooleanDefaultValue.class);
                if (booleanDefaultValueAnnotation != null) {
                    defaultValue = booleanDefaultValueAnnotation.value();
                }
                var doubleDefaultValueAnnotation = field.getAnnotation(DoubleDefaultValue.class);
                if (doubleDefaultValueAnnotation != null) {
                    defaultValue = doubleDefaultValueAnnotation.value();
                }
                var floatDefaultValueAnnotation = field.getAnnotation(FloatDefaultValue.class);
                if (floatDefaultValueAnnotation != null) {
                    defaultValue = floatDefaultValueAnnotation.value();
                }
                var intDefaultValueAnnotation = field.getAnnotation(IntDefaultValue.class);
                if (intDefaultValueAnnotation != null) {
                    defaultValue = intDefaultValueAnnotation.value();
                }
                var longDefaultValueAnnotation = field.getAnnotation(LongDefaultValue.class);
                if (longDefaultValueAnnotation != null) {
                    defaultValue = longDefaultValueAnnotation.value();
                }
                var stringDefaultValueAnnotation = field.getAnnotation(StringDefaultValue.class);
                if (stringDefaultValueAnnotation != null) {
                    type = OptionType.STRING;
                    defaultValue = stringDefaultValueAnnotation.value();
                }
                String since = null;
                var sinceAnnotation = field.getAnnotation(Since.class);
                if(sinceAnnotation != null) {
                    since = sinceAnnotation.value();
                }
                return Collections.singletonList(new DefaultOption(key, type, description, required, defaultValue, since));
            }
Configuration class for configuration introspection

@return the configuration class
plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedDriverBase.java