3

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

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 方法派生。理想情况下,将处理接口中的协变返回类型。实现应该通过使用私有最终变量和构造函数实例化来支持不变性。应该生成 equals、hashCode 和 toString 方法。

4

4 回答 4

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() and equals()...”,即)

于 2009-04-14T13:28:45.707 回答
1

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

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

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

于 2009-04-14T08:12:56.153 回答
1

如果您打算做很多事情,那么您可能希望考虑 javac 中内置的注释处理器功能(回到 Java SE 1.5 中)。

于 2009-04-14T11:19:43.210 回答
0

除了使用可以帮助您进行样板编码的现代 Java IDE 之外,您还可以使用动态代理进行检查

于 2009-04-14T09:30:04.987 回答