2010-06-11 26 views
30

¿Hay alguna manera de anotar una clase interna anónima en Java?Anotar clase interna anónima

En este ejemplo, ¿podría agregar una anotación de nivel de clase a Class2?

public void method1() { 
    add(new Class2() { 
    public void method3() {} 
    }); 
} 

Respuesta

32

No. Tendría que promocionarlo a una clase "adecuada". Todavía se puede delimitar dentro de la clase externa si es necesario, por lo que no necesita ser una clase de nivel superior, pública, o lo que sea. Pero sí necesita una definición de clase adecuada para adjuntar la anotación.

+2

La clase "correcta", incluso se puede definir dentro del método, por lo que su alcance es local en el método y el diseño -wise sigue siendo un detalle de implementación interna del método. – amichair

+0

Si le sorprende la descripción de @ amichair de las clases locales (como yo), tenga en cuenta que es nueva para JDK8 y los documentos están aquí: https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses. html –

+0

Parece que las clases locales han existido desde Java 1.1 ... pero todavía son sorprendentes :-) – amichair

10

Todavía no. Esta característica es sugerida por JSR 308, y puede incluirse en futuras versiones de Java.

+7

Es posible que desee agregar un "No" explícito de lo contrario, tu respuesta provoca un error de página mental. –

6

Sí, as mentioned by yegor256, es posible, desde JDK 8 adopted JSR 308 (type annotations).

Ahora, cada vez que una anotación está decorada por @Target({ElementType.TYPE_USE}), se puede utilizar para anotar una clase anónima en tiempo de ejecución. Por ejemplo:

@Target({ ElementType.TYPE_USE }) 
@Retention(RetentionPolicy.RUNTIME) 
@interface MyAnnotation { 
    String value(); 
} 

Object o = new @MyAnnotation("Hello") Object() {}; 

La parte difícil es cómo acceder a la anotación:

Class<?> c = o.getClass(); 
    AnnotatedType type = c.getAnnotatedSuperclass(); 
    System.out.println(Arrays.toString(type.getAnnotations())); 
+0

¿Hay alguna documentación sobre cómo acceder a este tipo de anotaciones? No pude encontrar la documentación oficial que necesito para acceder a ellos con 'o.getClass(). GetAnnotatedSuperclass(). GetAnnotations()' que me parece extraño y contra-intuitivo – Qw3ry

Cuestiones relacionadas