';动态'-比如java注释?

';动态'-比如java注释?,java,annotations,Java,Annotations,我有一个依赖于注释的pojo。它具有预定义字段以及包含用户提供字段的集合: public class MyPOJO implements Document { private String id; private LocalString name; private LocalString desc; private List<Field> fields; public MyPOJO(final String id,

我有一个依赖于注释的pojo。它具有预定义字段以及包含用户提供字段的集合:

public class MyPOJO implements Document {

  private String id;
  private LocalString name;
  private LocalString desc;
  private List<Field> fields;

  public MyPOJO(final String id,
                          final LocalString name,
                          final LocalString desc,
                          final List<Field> fields) {
    this.id = id;
    this.name = name;
    this.desc = desc;
    this.fields = fields;
  }

  public String getId() {
    return id;
  }

  @Indexed(searchable = false, stored = true)
  public LocalString getName() {
    return name;
  }

  @Indexed(searchable = true)
  public LocalString getDescription() {
    return desc;
  }

  public List<Field> getFields() {
    return fields;
  }

}
公共类MyPOJO实现文档{
私有字符串id;
私有LocalString名称;
私有LocalString描述;
私有列表字段;
公共MyPOJO(最终字符串id,
最终的LocalString名称,
最终本地字符串描述,
最终列表字段){
this.id=id;
this.name=名称;
this.desc=desc;
this.fields=字段;
}
公共字符串getId(){
返回id;
}
@索引(searchable=false,stored=true)
公共LocalString getName(){
返回名称;
}
@索引(searchable=true)
公共LocalString getDescription(){
返回描述;
}
公共列表getFields(){
返回字段;
}
}
MyPOJO是一个“通用”对象,即MyPOJO的开发人员(或消费者)具有MyPOJO中未预定义的字段,因此开发人员需要将这些附加字段放置在属性“字段”中。问题产生于这样一个事实,即集合字段中的每个对象都需要有自己的注释,以指示特定字段是存储的还是可搜索的,以便与预定义属性(如名称)保持一致

我可以想出两个选择:

  • 对于每个附加字段,开发人员必须创建一个 实现接口字段的匿名类,并在该类中 匿名类,开发人员将声明适用的 注释

  • 集合“fields”包含fieldname、fieldvalue的复杂对象 和注释,如下所示。我不知道如何调用字段的构造函数。下面的代码不编译,但它是作为伪代码来表示我正在尝试做什么

    字段myfield1=新字段(“dateofBirth”,new Date(),new ArrayList({Index.stored,Index.searchable}); 字段myfield2=新字段(“模型”,“330i”,新ArrayList({Index.stored})

  • 没有将注释作为参数传递的构造:new ArrayList({Index.stored}

    public class Field  {
    
      private String name;
      private Object value;
      Collection<Annotation> annotations;
    
      public Field(final String name, final Object value, Collection<Annotation> annotations;) {
        this.name = name;
        this.value = value;
        this.annotations = Collections.unmodifiableCollection(annotations);
      }
    
      public String getName() {
        return name;
      }
    
      public Object getValue() {
        return value;
      }
    }
    
    公共类字段{
    私有字符串名称;
    私人客体价值;
    藏书注释;
    公共字段(最终字符串名称、最终对象值、集合注释;){
    this.name=名称;
    这个值=值;
    this.annotations=Collections.unmodifiableCollection(annotations);
    }
    公共字符串getName(){
    返回名称;
    }
    公共对象getValue(){
    返回值;
    }
    }
    

    我对这两个选项都不太感兴趣,希望有人能给我一些建议

    如果你需要一个可扩展的对象模型,我会说POJO设计只是让你自己做额外的工作,而不是暴露一个元模型


    也就是说,您可以让API子类的客户机
    MyPOJO
    ,并对它们在子类中定义的属性进行注释。然后,您可以使用反射来检查您正在接收的对象的所有JavaBeans属性,并确定getter上的注释-类似于JPA的工作方式。

    这其实并不多文档接口是API和myPOJO的子类对象,其中包含客户机认为是标准的字段。但是客户机本身在编译时没有所有字段,需要在运行时从数据模型中提供这些字段。在这种情况下,您可能会遇到您描述的选项2–实现设置一个运行时元模型。注释是一个编译时功能,我认为没有其他方便的方法使用它们。谢谢。我尝试了选项2,但我不知道如何传递注释列表,如上面更新的问题所示。知道吗?注释也是常规的Java接口-对于运行时保留的接口,我猜是这样的Java动态生成一个实现类。如果您想重用注释接口,您必须自己实现注释接口,该接口允许您在构造函数/使用setters/中指定参数值,并为注释中声明的方法返回它们。