用Java制作带有注释的自定义表单

用Java制作带有注释的自定义表单,java,annotations,java-annotations,Java,Annotations,Java Annotations,我正在尝试制作带有注释的自定义表单。我的想法是,给定一个带注释的类,我的代码可以生成一个FXGUI表单来编辑该类的对象。代码中应该更清楚: @... @interface Form { String label() default ""; } @Form class SomeData { @Form(label="Name") String name; @Form(label="Age") int age; ... } class FormBuilder { Pa

我正在尝试制作带有注释的自定义表单。我的想法是,给定一个带注释的类,我的代码可以生成一个FXGUI表单来编辑该类的对象。代码中应该更清楚:

@...
@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);
    ...
  }
}
我现在开始使用自定义注释,但还不知道如何:

  • 迭代带注释类的带注释字段
  • 获取其注释数据(标签:字符串)
  • 获取带注释字段的类型(在本例中,名称:String和年龄:Integer

为了在讨论代码之前实现方法
makeForm

,我认为您需要另一个注释来表示表示自定义表单的类。当前的
@Form
注释更适合于字段级别,因为它代表每个表单字段的标签。我想把它重命名为
@FormField
。然后,可以使用
@Form
注释来告诉反射API哪些类是自定义表单

现在,继续讲代码。首先,您需要初始化应用程序中的反射。该软件包将是您希望在应用程序中使用反射的第一个软件包

private static Reflections=new Reflections(“your.java.package”)

要使用
@表单
注释对每个类进行注释,您可以使用:


setThank@dylansheppard,但是我应该在代码中的什么地方初始化反射?在
main
内部,还是将其用作
FormBuilder
的属性?您可以执行以下任一操作。如果main是
FormBuilder
类的一部分,我会将反射设置为静态类变量,并在main方法中初始化它。这样,当调用
makeForm
时,所有的反射内容都已经初始化了。虽然没有它,它仍然可以工作,但我不知道
反射的目的是什么。它来自外部Java库吗?它是一个外部库。抱歉,忘了它没有包含在Java中。您可以在github上找到源代码。您可以使用Maven之类的依赖项管理工具,也可以下载源代码并将其放入项目中。如果你没有时间紧迫,Maven是你的选择。
// 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
            }
        }
    }