suppresswarnings sirven sirve que para las ejemplo crear anotaciones annotation java inheritance interface annotations guice

sirven - crear annotation en java



¿Por qué las clases de Java no heredan las anotaciones de las interfaces implementadas? (2)

He estado usando el AOP de Guice para interceptar algunas llamadas a métodos. Mi clase implementa una interfaz y me gustaría anotar los métodos de interfaz para que Guice pueda seleccionar los métodos correctos. Incluso si el tipo de anotación está anotado con una anotación Inherited , la clase de implementación no hereda la anotación como se indica en el documento java de Heredado:

Tenga en cuenta también que esta metaanotación solo hace que las anotaciones se hereden de las superclases; las anotaciones en las interfaces implementadas no tienen ningún efecto.

¿Cuál podría ser la razón de ésto? Conocer todas las interfaces que la clase de un objeto implementa en tiempo de ejecución no es tan difícil, por lo que debe haber una buena razón detrás de esta decisión.


Desde el Javadoc para @ Heredado:

Indica que un tipo de anotación se hereda automáticamente. Si hay una metaanotación Heredada en una declaración de tipo de anotación, y el usuario consulta el tipo de anotación en una declaración de clase, y la declaración de clase no tiene ninguna anotación para este tipo, la clase de la clase se consultará automáticamente para el tipo de anotación. Este proceso se repetirá hasta que se encuentre una anotación para este tipo, o se alcance la parte superior de la jerarquía de clases (Objeto). Si ninguna superclase tiene una anotación para este tipo, la consulta indicará que la clase en cuestión no tiene dicha anotación. Tenga en cuenta que este tipo de metarotación no tiene ningún efecto si el tipo anotado se utiliza para anotar cualquier cosa que no sea una clase. Tenga en cuenta también que esta metaanotación solo hace que las anotaciones se hereden de las superclases; las anotaciones en las interfaces implementadas no tienen ningún efecto.

Por otro lado, los validadores JSR 305 hacen algún tipo de búsqueda de herencia. Si tienes una jerarquía de clases:

//Person.java @Nonnull public Integer getAge() {...} //Student.java (inherits from Person) @Min(5) public Integer getAge() {...}

Entonces las validaciones efectivas en Student.getAge() son @Nonnull @Min(5) . @Nonnull no @Inherited meta-anotación @Inherited .


Diría que la razón es que, de lo contrario, se produciría un problema de herencia múltiple.

Ejemplo:

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface Baz { String value(); } public interface Foo{ @Baz("baz") void doStuff(); } public interface Bar{ @Baz("phleem") void doStuff(); } public class Flipp{ @Baz("flopp") public void doStuff(){} } public class MyClass extends Flipp implements Foo, Bar{}

Si hago esto:

MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value()

¿Cuál será el resultado? ''baz'', ''phleem'' o ''flopp''?

Por esta razón, las anotaciones en las interfaces rara vez son útiles.