自动生成的值对象

时间:2009-04-14 07:52:53

标签: java annotations runtime code-generation compile-time

给定一个或多个接口,生成类实现的最佳方法是什么?

interface Vehicle
{
    Engine getEngine();
}

@Generated
class Car implements Vehicle
{
    private final Engine engine;

    public Car(Engine engine)
    {
        this.engine = engine;
    }

    public Engine getEngine()
    {
        return engine;
    }

    // generated implementation of equals, hashCode, toString, 
}

类变量应该从接口的getter方法派生。理想情况下,将处理接口中的协变返回类型。实现应该通过使用私有final变量和构造函数实例来支持不可变性。应该生成equals,hashCode和toString方法。

4 个答案:

答案 0 :(得分:3)

更简洁的方法是使用CGLIB在运行时动态生成类。显然,您无法浏览源文件。

如果您需要源文件,可以尝试codemodel并执行以下操作:

JCodeModel cm = new JCodeModel();
x = cm._class("foo.bar.Car");
x.field(Engine.class, "engine");
for (PropertyDescriptor pd:    Introspector.
              getBeanInfo(Vehicle.class).getPropertyDescriptors()) {
    g = x.method(JMod.PUBLIC, cm.VOID, pd.getReaderMethod().getName()); 
    g.body()...
    s = x.method(JMod.PUBLIC, cm.VOID, "set" + pd.getName());
    s.body()...
}
hc = x.method(JMod.PUBLIC, cm.VOID, "hashCode"));
hc.body()...
cm.build(new File("target/generated-sources"));

或者如前所述,使用IDE(在Eclipse中:菜单“Source”,“Generate hashcode()和equals()......”,即。)

答案 1 :(得分:1)

在为接口实现类时,就像eclipse一样。

如果方法以get开头,则将其视为getter并解析方法以提取变量名称及其类型。为这些字段创建构造函数,并实现equals,hashcode和toString方法。

你可以进行正常的文件解析,也许反射也可以帮助不确定。

答案 2 :(得分:1)

如果您打算做得非常多,那么您可能希望考虑javac内置的注释处理器功能(在Java SE 1.5中更新)。

答案 3 :(得分:0)

除了使用现代java IDE帮助您进行样板编码之外,您还可以使用dynamic Proxy

进行检查