Могу ли я создать общий интерфейс для классов с определенной аннотацией?

Я хотел бы знать, есть ли способ создать общий интерфейс, который можно было бы реализовать со всеми классами, имеющими определенную аннотацию на уровне класса.

Например:

@XmlRootElement
public class Subscription { ... }

@XmlRootElement
public class Author { ... }

Я хотел бы создать общий интерфейс, применимый к этим двум классам (и многим другим). Есть ли способ добиться этого?


person mmjmanders    schedule 22.03.2011    source источник
comment
Что именно интерфейс должен требовать от классов для реализации? Аннотации? Какие-то методы?   -  person justkt    schedule 22.03.2011
comment
Вы можете добавить интерфейс ко всем классам, которые имеют аннотацию, но вы ожидаете, что а) это будет сделано автоматически б) сделать что-то полезное?   -  person Peter Lawrey    schedule 22.03.2011


Ответы (3)


Интерфейсы и наследование используются для распространения функциональности «по вертикали», вниз по графу наследования.

Аннотации предназначены для дополнительных функций, которые можно прикрутить к классам, методам и т. д., и практически не связаны с интерфейсами.

Если вы заранее знаете, какими будут ваши классы и как они будут связаны друг с другом, вам, вероятно, вообще не нужны аннотации. Причина этого в том, что вы можете заставить их реализовывать интерфейсы маркеров (например, java.io.Serializable), которые практически аналогичны аннотациям уровня класса (без параметра), за исключением того, что с ними гораздо проще работать.

person biziclop    schedule 22.03.2011

Это невозможно со стандартной Java, но вы можете использовать AspectJ Inter-Type. объявления типов.

Например, этот аспект добавит WhatEverInterface и реализацию к каждому классу, аннотированному @XmlRootElement.

public aspect MyAspect {
   declare parents: (@XmlRootElement) implements WhatEverInterface;

    public void WhatEverInterface.doSomething() {
       System.out.println("something");
    } 
}
person Ralph    schedule 22.03.2011

Это так просто:

interface XmlProcessor
{
    public void process(XmlRootElement root);
}
person Suraj Chandran    schedule 22.03.2011
comment
+0: ​​Это позволит вам обработать аннотацию, но не класс, к которому она привязана. - person Peter Lawrey; 22.03.2011