Создание пользовательских форм с аннотациями в Java - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь сделать пользовательские формы с аннотациями. Моя идея состоит в том, что с учетом аннотированного класса мой код может генерировать форму FX GUI для редактирования объектов этого класса. Это должно быть понятнее в коде:

@...
@interface Form {
  String label() default "";
}

@Form
class SomeData {
  @Form(label="Name")
  String name;
  @Form(label="Age")
  int age;
  ...
}

class FormBuilder {
  Pane makeForm(Class annotated) {
    Pane pane = ... ;
    for (/*each annotated field*/) {
      Label label = new Label(/*field's annotated label*/));
      Control field = generateControl(/*annotated field's type*/));
      ...
      pane.getChildren().addAll(label, field);
    }
    return pane;
  }

  Control generateControl(Class type) {
    // returns the control that matches with the type
    // its everything OK here
  }

  main(...) {
    Pane someDataForm = makeForm(SomeData.class);
    ...
  }
}

Я сейчас начинаю в пользовательских аннотациях и пока не понимаю, как:

  • Перебирать аннотированные поля аннотированного class
  • Получить аннотированные данные ( label : String)
  • Получить аннотированный тип поля (имя: String и возраст: Integer в данном случае)

для реализации способа makeForm

1 Ответ

0 голосов
/ 01 февраля 2020

Прежде чем мы перейдем к коду отражений, я думаю, что вам понадобится еще одна аннотация для представления ваших классов, представляющих пользовательскую форму. Ваша текущая аннотация @Form лучше подходит на уровне поля, поскольку она представляет метку для каждого поля формы. Я бы переименовал это в @FormField. Затем ваша аннотация @Form может быть использована только для того, чтобы сообщить API отражений, какие классы являются пользовательскими формами.

Теперь перейдем к коду. Во-первых, вам нужно инициализировать отражения в вашем приложении. Этот пакет будет первым пакетом, в котором вы хотите использовать отражение в своем приложении.

private static Reflections reflections = new Reflections("your.java.package");

Чтобы каждый класс помечался аннотацией @Form, вы можете использовать:

Set<Class<? extends Forms>> customForms = reflections.getTypesAnnotatedWith(Form.class)

Теперь вы можете l oop через каждую пользовательскую форму и анализировать аннотации каждого поля:

// Loop through every class with Form annotation
    for (Class<? extends Forms> form : customForms) {
        for (Field field : form.getDeclaredFields()) {
            // Check each field, if it has your FormField attribute, you can then access the annotation methods
            if (field.isAnnotationPresent(FormField.class)) {
                Label label = new Label(field.getAnnotation(FormField.class).label());
                // Do additional stuff to build your form
            }
        }
    }
...