2009-04-14 4 views
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, 
} 

Переменные класса должны быть получены из методов геттера интерфейса. В идеальном случае ковариантные типы возврата в интерфейсах будут обрабатываться. Реализация должна способствовать неизменности, используя частные конечные переменные и экземпляр конструктора. Должны быть созданы методы equals, hashCode и toString.

ответ

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: Меню «Источник», «Создать хэш-код() и equals() ... ", т.е.)

+0

Я попробую JCodeModel. Благодаря! – parkr

1

Как и для eclipse, при реализации класса для интерфейса.

Если метод начинается с get, рассмотрим это как getter и проанализируем метод для извлечения имени переменной и ее типа. Создайте конструктор для этих полей, а также реализуйте методы equals, hashcode и toString.

Вы можете выполнить обычный синтаксический анализ файла или, может быть, отражение также не поможет.

0

кроме того, используя современные Java IDE, которая помогает вам в шаблонном кодировании вы также можете проверить с помощью dynamic Proxy

1

Если вы собираетесь делать это очень много, то вы можете рассмотреть возможность аннотации процессора построен в javac (apt обратно в Java SE 1.5).

Смежные вопросы