dma*_*a_k 8 jaxb xjc sun-codemodel jcodemodel
我的问题涉及编写JAXB插件,特别是JAXB代码模型.
ClassOutline
(及其同伴)和JClass
(和同伴)和CClass
(和同伴)的角色是什么?在查看相应包中的类列表时,不清楚什么是鸡,什么是鸡蛋.
我的解释是CClass
(CPropertyInfo
,CEnumConstant
...)是由XJC在XSD的初稿解析时创建的.然后,一些神奇的发生,这种模型转化为JClass
(JFieldVar
,JEnumConstant
,...),这转变过程中的自定义应用.然后调用插件.ClassOutline
用作这两个模型之间的桥梁.总之看起来非常复杂.
通过这些并行模型,我相信可以通过多种方式获得相同的信息.例如,类字段类型:
JClass#fields()
→交通JFieldVar#type
→交通JType
CClassInfo#getProperties()
→交通CPropertyInfo#baseType
→交通JType
我正在寻找上述模型生命周期的详细解释.谢谢.
lex*_*ore 18
哦,哦,有人对XJC内部感兴趣.我可能会有所帮助,因为我可能开发了比其他任何人更多的JAXB插件(例如参见JAXB2 Basics)
好的,我们开始吧.在XJC中,模式编译器大致遵循
让我们从最后两个开始吧.
我希望Java文件不需要解释.
代码模型也是一件相对简单的事情.它是一个可用于以编程方式构造Java代码的API.你可以只使用字符串连接,但它更容易出错.使用CodeModel,您几乎可以保证获得至少语法正确的Java代码.所以我希望这一部分也很清楚.(顺便说一句,我非常喜欢CodeModel.我最近根据CodeModel的想法编写了JavaScript代码模型.)
现在让我们来看看"模型"和"大纲".模型是解析传入模式的结果.它模拟传入模式的构造,主要是对应于复杂类型的"类"和对应于元素,属性和值的"属性"(例如,当您具有简单内容的复杂类型时).
应该将模型理解为接近XML和模式的逻辑建模构造.因此,它只描述了它们具有的类型和属性.我描述它的方式肯定要复杂得多,有各种各样的例外和警告 - 从wilcard类型(xsd:any),替换组,枚举,内置类型等开始.
非常有趣的Model
是RuntimeTypeInfoSetImpl
,JAXB在运行时使用的是兄弟姐妹.所以它也是一种模型 - 然而,它不是从XML Schema中解析而是从类中的JAXB注释中解析出来的.这个概念是一样的.Model和RuntimeTypeInfoSetImpl
实现TypeInfoSet
接口都是超级构造.检查接口ClassInfo
和PropertyInfo
- 它们在编译时(CClassInfo
和CPropertyInfo
在XJC中)和运行时(RuntimeClassInfoImpl
对于JAXB RI等)都有实现.
好的,所以当XJC解析并分析了架构时,你就得到了Model
.这Model
还不能产生代码.实际上,有不同的生成代码的策略.您可以生成带注释的类,也可以像在JAXB 1中一样生成接口/实现类对.整个代码生成实际上并不是模型的任务.此外,有许多方面与Java代码的物理特性相关,但与模型并不真正相关.例如,您必须将类分组到包中.这是由Java的打包系统驱动的,而不是由模型本身的属性驱动的.
这就是轮廓发挥作用的地方.您可以在架构模型和代码模型之间看到大纲.您可以将轮廓视为代码模型元素的工厂,负责组织代码和生成JDefinedClass
es CClassInfo
.
所以你说得对,确实非常复杂.我不是Sun/Oracle员工,我没有设计它(我知道做过它的人,但非常尊重他).我可以猜出某些设计决策的几个原因,例如:
我同意这种设计非常复杂,但它有其原因.一个证明就是实际上可以构建用于XML到JavaScript映射的映射生成器 - 基本上在相同的模型上.我只需要替换代码生成,使模式分析完整无缺.(请参阅Jsonix.)
好的,希望我能说明为什么XJC中的事情是这样的.祝你好运这些API,它们并非直截了当.随意检查现有的开源代码,有很多可用的例子.
PS.真的一直想写这个.:)
归档时间: |
|
查看次数: |
1355 次 |
最近记录: |