使用生成的Java源代码,例如
使用Hibernate工具生成的
使用JAXB架构绑定(Xjc)生成的
使用WDSL2Java (cxf)生成的
所有生成的类都是“值对象”类型,没有业务逻辑。如果我将方法添加到生成的源代码中,如果我重复源代码生成,我将丢失这些方法。
这些Java代码生成工具是否提供了“扩展”生成的代码的方法?
例如,
发布于 2009-04-23 09:20:03
对于JAXB,请参阅Adding Behaviours。
基本上,将JAXB配置为返回通常期望的对象的自定义实例。在下面的示例中,您将创建一个新对象PersonEx,它扩展了JAXB对象Person。这种机制可以很好地工作,因为您是从生成的类派生的,并且根本不会更改JAXB类或模式。
package org.acme.foo.impl;
class PersonEx extends Person {
@Override
public void setName(String name) {
if(name.length()<3) throw new IllegalArgumentException();
super.setName(name);
}
}
@XmlRegistry
class ObjectFactoryEx extends ObjectFactory {
@Override
Person createPerson() {
return new PersonEx();
}
}
请注意,@Override指令在JAXB对象发生更改的情况下非常重要-它将防止您的定制成为孤立的。
发布于 2009-04-23 07:41:03
至于Hibernate,你可以调整代码生成中使用的模板文件来改变它们的行为。如果要调整可编辑的HIbernate工具,例如:dao/daohome.ftl
您甚至可以在编辑.hbm.xml文件时向"toString()“输出中添加字段
...
<property name="note" type="string">
<meta attribute="use-in-tostring">true</meta>
<column name="note" />
</property>
...
对于日志和验证,您都可以考虑使用AOP with AspectJ (我不建议修改生成的代码,因为您可能希望从头开始多次构建)。
发布于 2009-04-23 07:42:49
首先,我要重申,修改生成的代码有许多与之相关的问题,在可能的情况下,应该避免这种情况。也就是说,有时在重新生成代码时,避免或付出更多努力是不切实际的,而不是仅仅处理更改。
遗憾的是,java不支持c#所具有的分部类的概念。这些都是为了解决这类问题。
您应该查看您的代码生成工具是否支持某种形式的有意义的注释,这些注释可以分隔您自己在类中添加的区域(如果您正在修改代码,而不是添加到代码中,这是不太可能的,也不会有任何帮助)
如果您真的希望这样做,最好的选择是最初生成文件,但立即将它们签入版本控制存储库。然后进行更改,将其签入。
下次您重新运行这些工具并让它们覆盖现有文件时,您可以与受源代码控制的文件进行比较,并将更改合并回来(大多数微不足道的更改,如添加新的列/表,都将是微不足道的。
如果代码生成器突然生成完全不同的代码(比如一个新版本),这将不会对您有多大帮助,但在这种情况下,您添加的任何代码,而不是简单的附加便利方法(依赖于已经公开的数据/方法),无论它如何混合到类中,都会出现问题。然而,版本控制系统仍然有帮助,因为它还记录了原始的更改,因此您可以看到之前添加的内容,以及您需要在新样式中重新创建的内容。
https://stackoverflow.com/questions/780567
复制相似问题