anotaciones son básicamente bits de datos que se puede unir a los campos, métodos, clases, etc.
La sintaxis para declarar anotaciones en Java es un poco incómodo . Se parecen un poco a las interfaces (son, después de todo, declaradas con @interface
), pero en realidad no son interfaces. Creo que podría haber puesto el método doTestTarget()
en su clase TestAnnotations
porque pensó que su anotación era una interfaz y que necesitaba implementarla. Esto no es cierto: puede eliminar este método y la llamada desde su código, si lo desea y no le causará ningún problema.
Además, es posible que no haya pensado poner la anotación en el campo str
. Las anotaciones se aplican solo a lo que les sigue inmediatamente. Como resultado, su código no se compila, porque ha aplicado su anotación a un campo pero ha declarado que su anotación solo se puede aplicar a los métodos. Cambie @Target(ElementType.METHOD)
a @Target(ElementType.FIELD)
y su código debe compilarse.
En cuanto a lo que sucede con la cadena Hello World !
, se escribe en el archivo .class y está disponible para cualquier herramienta que lea en las clases de Java. Sin embargo, no estaría necesariamente disponible en la JVM en tiempo de ejecución. Esto sucede porque no especificó un @Retention
para su anotación @Test_Target
. El valor predeterminado para @Retention
es RetentionPolicy.CLASS
, lo que significa que la JVM podría no molestarse en cargarlos fuera del archivo de clase. (Consulte Javadoc for the RetentionPolicy enum.)
Imagino que desea ver alguna forma de leer el valor de esta anotación en tiempo de ejecución.Si es así, recomiendo agregar @Retention(RetentionPolicy.RUNTIME)
a su anotación para asegurarse de que estará disponible en tiempo de ejecución.
Para acceder a su anotación y el valor que contiene en tiempo de ejecución, debe usar la reflexión. He reescrito la clase TestAnnotations
de la siguiente manera para dar una rápida demostración:
import java.lang.reflect.Field;
public class TestAnnotations {
@Test_Target(doTestTarget="Hello World !")
private String str;
public static void main(String[] args) throws Exception {
// We need to use getDeclaredField here since the field is private.
Field field = TestAnnotations.class.getDeclaredField("str");
Test_Target ann = field.getAnnotation(Test_Target.class);
if (ann != null) {
System.out.println(ann.doTestTarget());
}
}
}
Cuando ejecuto el código, me da el siguiente resultado:
Hello World !
¿Qué esperarías * que hiciera el código? –
lo siento Michael ... pero como soy completamente nuevo en este tema ... ¿pueden decirme por qué pasamos esa cadena cuando no esperábamos que la consola la mostrara? –
¿Qué material en línea estaba leyendo? –