Jaxb XJC生成另一个字段类型(对get方法的影响)
使用最新的JAXB(Metro)并使用XJC生成Java 希望(如其他用户所要求的)为表示无界序列的字段生成java.util.Set作为类型。看起来XJC将该类型的字段捕获为非类型的ListField,默认行为是生成java.util.List(仅getter)。如果我做了一些类似于collection setter injector插件的事情,并调整字段的类型,如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
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());
}
希望这对您有所帮助。您能发布模式的相关部分吗?