Jaxb XJC生成另一个字段类型(对get方法的影响)

Jaxb XJC生成另一个字段类型(对get方法的影响),jaxb,xjc,Jaxb,Xjc,使用最新的JAXB(Metro)并使用XJC生成Java 希望(如其他用户所要求的)为表示无界序列的字段生成java.util.Set作为类型。看起来XJC将该类型的字段捕获为非类型的ListField,默认行为是生成java.util.List(仅getter)。如果我做了一些类似于collection setter injector插件的事情,并调整字段的类型,如 public boolean run(Outline model, Options opt, ErrorHandler err

使用最新的JAXB(Metro)并使用XJC生成Java

希望(如其他用户所要求的)为表示无界序列的字段生成java.util.Set作为类型。看起来XJC将该类型的字段捕获为非类型的ListField,默认行为是生成java.util.List(仅getter)。如果我做了一些类似于collection setter injector插件的事情,并调整字段的类型,如

 public boolean run(Outline model, Options opt, ErrorHandler errorHandler) {
    for (ClassOutline co : model.getClasses()) {
       FieldOutline[] fo = co.getDeclaredFields();

       for ...
          if ((fo[i] instanceof UntypedListField)) {
            --> DO SOMETHING WITH THIS FIELD
          }
    }
 }

人们是如何调整类型的,还是更容易构造一个新字段,然后在类大纲中的声明字段集中替换它?弄乱字段的类型如何影响属性上get方法的生成?

看起来您要使用自己的XJC插件。这就是你需要做的。将您的
-->DO SOMETHING WITH THIS FIELD
行替换为以下内容

首先,找出fo[i]的参数化类型是什么(我称之为f)。 然后,创建集合JType。最后将
f
的类型设置为
setType

jtypeinner=((JClass)f.type()).getTypeParameters().get(0);
JType setType=co.parent().getCodeModel().ref(Set.class).狭窄(内部);
f、 类型(setType);
方法
shown()
用于设置参数化类型

到目前为止看起来不错,但问题是插件将在XJC生成类之后运行。这意味着getter已经在那里了。所以我们需要更换它

下面是
replacegatter()
方法

private void replaceGetter(ClassOutline co、JFieldVar f、JType inner){
//创建方法名
字符串get=“get”;
String name=f.name().substring(0,1).toUpperCase()
+f.name().子字符串(1);
String methodName=get+name;
//创建HashSet JType
JType hashSetType=co.parent().getCodeModel().ref(HashSet.class).窄带(内部);
//找到并删除旧的Getter!
JMethod oldgeter=co.implClass.getMethod(methodName,新的JType[0]);
co.implClass.methods().remove(oldGetter);
//创建新的Getter
JMethod getter=co.implClass.method(JMod.PUBLIC,f.type(),methodName);
//创建Getter Body->{if(f=null)f=newhashset();返回f;}
getter.body()。\u if(JExpr.ref(f.name()).eq(JExpr.\u null())。\u then()
.assign(f,JExpr._new(hashSetType));
getter.body()返回(JExpr.ref(f.name());
}

希望这对您有所帮助。

您能发布模式的相关部分吗?