我的问题涉及编写 JAXB 插件,尤其是ClassOutline
内部插件。
里面有com.sun.tools.xjc.outline.ClassOutline
字段:
- 目标
- 参考
- 实现类
- implRef
代码:
/**
* This {@link ClassOutline} holds information about this {@link CClassInfo}.
*/
public final @NotNull CClassInfo target;
/**
* The exposed aspect of the a bean.
*
* implClass is always assignable to this type.
* <p>
* Usually this is the public content interface, but
* it could be the same as the implClass.
*/
public final @NotNull JDefinedClass ref;
/**
* The implementation aspect of a bean.
* The actual place where fields/methods should be generated into.
*/
public final @NotNull JDefinedClass implClass;
/**
* The implementation class that shall be used for reference.
* <p>
* Usually this field holds the same value as the {@link #implClass} method,
* but sometimes it holds the user-specified implementation class
* when it is specified.
* <p>
* This is the type that needs to be used for generating fields.
*/
public final @NotNull JClass implRef;
据我所知(所以回答):
target
- 在 中保存信息Model
,表示已解析和分析的架构文件 (.xsd)ref
通常等于implClass
并且两者都成立Code Model
implClass
是放置新生成的字段、方法等的正确位置。implRef
- 它是什么?
我想将新字段添加到描述的类中ClassOutline
,所以代码如下所示:
JDefinedClass dstClass = classOutline.ref;
JFieldVar dstField = dstClass.field(srcField.mods().getValue(),
srcField.type(), srcField.name());
它工作得很好,直到在执行上述代码并使用com.sun.tools.xjc.outline.ClassOutline.getDeclaredFields()
方法之后有另一个插件工作。
想象一下 -Plugin1
创建新字段,然后执行CopyablePlugin并希望添加clone()
复制每个字段的方法。但CopyablePlugin
没有看到新生成的字段Plugin1
- 因为要从使用方法中检索所有字段,如下所示ClassOutline
:CopyablePlugin
com.sun.tools.xjc.outline.ClassOutline.getDeclaredFields()
/**
* Gets all the {@link FieldOutline}s newly declared
* in this class.
*/
public final FieldOutline[] getDeclaredFields() {
List<CPropertyInfo> props = target.getProperties();
// ...
请注意,它getDeclaredFields()
从字段中检索属性ClassOutline.target
(这是Model
已解析的 XSD 模式)并完全忽略生成到ClassOutline.implClass
.
它是错误还是功能?
现在我找到了解决方法。相同的字段也作为属性添加到target
:
classOutline.target.addProperty(prop);
问题
- 能解释一下吗,是什么角色
ref/implClass/implRef
? - 我应该在哪里生成全新的字段/方法?进
ref/implClass
? - 是否有必要保持 和 之间的
ref/implClass
一致性target
?添加到的新字段implClass
也应该添加到target
,对吗? - 是否
com.sun.tools.xjc.outline.ClassOutline.getDeclaredFields()
正确?或者如何正确地从 ClassOutline 中检索所有字段?也许这应该是target
和implClass
内容的结合?