我正在使用jaxb从xsd生成代码。
生成的代码包含大量注释;对于课程和领域。
我正在尝试使用com.sun.tools.internal.xjc.Plugin
来修改生成的代码。
在插件run()
方法中,我们获得了一个Outline
类,我们可以从中获取ClassOutline
。 ClassOutline
有一个JDefinedClass
最终成员,其中包含有关将要生成的实际课程的信息。
如果我想添加任何内容,可以使用JDefinedClass
中的apis。但如果我想删除某些东西,就没有办法了。
e.g。我无法清除注释,因为JDefinedClass.annotations()
方法返回UnmodifiableCollection
。所以我无法清除它或从中移除任何东西。
我尝试通过调用JDefinedClass
方法创建另一个_class
,但ClassOutline.implClass
变量是最终的,所以我无法设置它。
如何获得没有任何注释的JDefinedClass
?
是否存在另一个代码生成阶段,我可以陷入其中以真正控制JDefinedClass
的生成?
答案 0 :(得分:1)
代码模型确实主要是“只写”。但是,谈到注释,你可能错过了com.sun.codemodel.JDefinedClass.removeAnnotation(JAnnotationUse)
和com.sun.codemodel.JMethod.removeAnnotation(JAnnotationUse)
等方法(从com.sun.codemodel.JAnnotatable.removeAnnotation(JAnnotationUse)
实现)。
所以他们在那里。您可以使用常规CodeModel API删除注释。
正如我所看到的,您还可以从类中删除字段和方法。那你到底错过了什么?
答案 1 :(得分:0)
JDefinedClass.annotations()它返回一个不可修改的集合对象,您不能对其进行修改。
为此,您可以在构建JCodeModel之前在类和字段级别限制注释的添加/删除。
您需要创建一个自定义的Jackson2Annotator类,该类扩展了Jackson2Annotator并根据您的要求覆盖它们的方法。
以下是用于特定类型的注释属性的几种方法:
通过查看Jackson2Annotator类,您可以发现更多适合您的需求。