Desde la introducción de las anotaciones en la versión Java 5.0, se ha convertido en una parte muy importante de la plataforma Java. Durante el proceso de desarrollo, a menudo vemos anotaciones como @Override y @depreced en el código de aplicación. En este artículo, le diré cuáles son las anotaciones, por qué deben presentarse, cómo funcionan las anotaciones, cómo escribir anotaciones personalizadas (a través de ejemplos) y, bajo qué circunstancias, puede usar anotaciones, así como las últimas anotaciones y ADF (marco de desarrollo de aplicaciones). Tomará un poco de tiempo, así que prepárate una taza de café y déjanos entrar en el mundo de la anotación.
¿Qué es la anotación?
Una palabra puede describir anotaciones, es decir, metadatos, es decir, datos que describen los datos. Por lo tanto, se puede decir que la anotación son los metadatos del código fuente. Por ejemplo, el siguiente código:
@OverridePublic String toString () {return "Esta es la representación de cadena del objeto actual.";}En el código anterior, reescribo el método toString () y uso la anotación @Override. Sin embargo, incluso si no uso la anotación @Override para marcar el código, el programa puede ejecutarse normalmente. Entonces, ¿qué significa la anotación? ¿Hay algún beneficio para escribir de esta manera? De hecho, @Override le dice al compilador que este método es un método de reescritura (metadatos que describen el método). Si el método no existe en la clase principal, el compilador informará un error, solicitando que el método no ha reescribido el método en la clase principal. Si deletreo accidentalmente el error tipográfico incorrecto, por ejemplo, escriba toString () como toString () {double r}, y no uso la anotación @Override, el programa aún se puede compilar y ejecutar. Pero los resultados de la operación serán muy diferentes de lo que esperaba. Ahora entendemos qué son las anotaciones, y el uso de anotaciones ayuda a leer el programa.
La anotación es un modificador especial aplicado a clases, métodos, parámetros, variables, constructores y declaraciones de paquetes. Es una herramienta seleccionada por el estándar JSR-175 para describir metadatos.
¿Por qué introducir anotaciones?
Antes (o incluso después de su uso), XML se usa ampliamente para describir metadatos. Algunos desarrolladores y arquitectos de aplicaciones han comenzado a encontrar que el mantenimiento de XML está empeorando cada vez más. Quieren usar algo estrechamente junto con el código, en lugar de una descripción del código que se acople libremente al código (y en algunos casos incluso completamente separado) como XML. Si busca "XML vs. Annotaciones" en Google, verá muchos debates sobre este tema. Lo más interesante es que la configuración XML realmente se introduce para separar el código y la configuración. Las dos vistas anteriores pueden confundirlo. Ambas vistas parecen formar un ciclo, pero cada uno tiene sus pros y contras. Usemos un ejemplo para comprender la diferencia entre los dos.
Si desea establecer muchas constantes o parámetros para su aplicación, XML es una buena opción en este caso porque no se conectará a un código específico. Si desea declarar un método como servicio, sería mejor usar la anotación porque en este caso, la anotación y el método deben estar estrechamente acoplados, y los desarrolladores deben reconocer esto.
Otro factor importante es que la anotación define una forma estándar de describir metadatos. Antes de esto, los desarrolladores generalmente definen metadatos a su manera. Por ejemplo, use interfaces etiquetadas, anotaciones, palabras clave transitorias, etc. Cada programador define metadatos a su manera, a diferencia de la forma estándar de Annotation.
Actualmente, muchos marcos usan XML y anotación en combinación para equilibrar los pros y los contras entre los dos.
¿Cómo funciona la anotación? ¿Cómo escribir una anotación personalizada?
Antes de decirle esta parte, le recomendamos que primero descargue el código de muestra de anotaciones AnnotationsSample.zip. Después de descargar, póngalo en el IDE que esté acostumbrado a usar. Estos códigos lo ayudarán a comprender mejor el mecanismo de anotación.
La anotación de escritura es muy simple, puede comparar la definición de anotación con la definición de interfaz. Veamos dos ejemplos: uno es la anotación estándar @Override, y la otra es la anotación definida por el usuario @Todo.
@Target (elementType.method) @Retention (retentionPolicy.source) public @Interface Anverride {}Es posible que tenga algunas preguntas sobre la anotación @Override, no hace nada, entonces, ¿cómo verifica que haya una función con el mismo nombre en la clase principal? Por supuesto, no te sorprendas, me estoy burlando de ti. La definición de anotación @Override no es solo ese pequeño código. Esta parte del contenido es muy importante, tengo que repetirlo nuevamente: las anotaciones son solo metadatos y no tienen nada que ver con la lógica de negocios. Es un poco difícil de entender, pero eso es todo. Si las anotaciones no contienen lógica de negocios, alguien debe implementarlas. Los usuarios de metadatos hacen esto. Las anotaciones solo proporcionan información sobre las propiedades que define (clase/método/paquete/dominio). Los usuarios de anotaciones (nuevamente, algún código) leen esta información e implementan la lógica necesaria.
Cuando usamos las anotaciones de Java (como @Override), el JVM es un usuario, que funciona a nivel de código de bytEnt. En este punto, los desarrolladores de aplicaciones no pueden controlar o usar anotaciones personalizadas. Entonces, explicemos cómo escribir anotaciones personalizadas.
Hablemos sobre los puntos clave de escribir anotaciones personalizadas una por una. En el ejemplo anterior, verá algunas anotaciones aplicadas a las anotaciones.
La versión J2SE5.0 proporciona cuatro tipos de meta anotaciones en java.lang.annotation, que anota específicamente otras anotaciones:
@Documented Una anotación de etiqueta de anotaciones simples que indica si la información de anotación se agrega al documento Java.
@Retention Define el ciclo de vida de esta anotación.
RetentionPolicy. La fuente se descarta durante la fase de compilación. Estas anotaciones ya no tienen ningún significado después de la compilación, por lo que no escriben bytecode. @Override, @SupessWarnings pertenecen a este tipo de anotación.
RetentionPolicy.Class se descarta cuando se carga la clase. Útil en el procesamiento de archivos de bytecode. Este es el método predeterminado para anotaciones.
RetentionPolicy. Runtime nunca se descartan, y la anotación se retiene durante el tiempo de ejecución, por lo que la información de la anotación puede leerse utilizando el mecanismo de reflexión. Nuestras anotaciones personalizadas generalmente se usan de esta manera.
@Target indica dónde se usa esta anotación. Si no se especifica, la anotación se puede colocar en cualquier lugar. Estos son algunos de los parámetros disponibles. Cabe señalar que la anotación de atributos es compatible. Si desea agregar anotación a los 7 atributos y solo excluir un atributo, entonces debe definir el objetivo para incluir todos los atributos.
@Inherited define la relación entre esta anotación y subclases
Entonces, ¿cómo es la definición interna de anotaciones? Las anotaciones solo admiten tipos básicos, tipos de cadenas y enumes. Todos los atributos en el comentario se definen como métodos y permiten que se proporcionen valores predeterminados.
@Target (elementType.method) @Retention (retentionPolicy.Runtime) @Interface TODO {public enum priority {Low, Medium, High} public enum status {iniciado, note_stared} string autor () predeterminado "yash"; prioridad prioridad () prioridad predeterminada; llow; estatus () status.notharted;};} El siguiente ejemplo demuestra cómo usar las anotaciones anteriores.
@Todo (priority = toDo.priority.medium, autor = "yashwant", status = toDo.status.started) public void incompletemethod1 () {// Se escribe alguna lógica comercial // aún no está completa} Si solo hay un atributo en la anotación, se puede nombrar directamente "valor", y no es necesario indicar el nombre del atributo al usarlo.
@interface autor {string value ();}@autor ("yashwant") public void somemethod () {} Pero hasta ahora todo se ve bastante bien. Definimos nuestras propias anotaciones y las aplicamos a los métodos de lógica empresarial. Ahora necesitamos escribir un programa de usuario para llamar a nuestra anotación. Aquí necesitamos usar el mecanismo de reflexión. Si está familiarizado con el código de reflexión, sabrá que la reflexión puede proporcionar nombres de clases, métodos y objetos variables de instancia. Todos estos objetos tienen el método getAnnotation () para devolver la información de anotación. Necesitamos convertir este objeto en nuestro comentario personalizado (después de verificar con instanciaf ()), y también podemos llamar a los métodos en el comentario personalizado. Eche un vistazo al siguiente código de ejemplo, utilizando la anotación anterior:
Class BusinessLogicClass = BusinessLogic.Class; for (Method Method: BusinessLogicClass.getMethods ()) {TODO TODONAnTation = (TODO) Method.getAnnotation (TODO.Class); if (toDoAnnotation! = NULL) {System.Println ("Method Name:" + Method.getName ();); : " + toDoAnnotation.author ()); System.out.println (" Prioridad: " + TODOAnTation.Priority ()); System.out.println (" Estado: " + TODOAnTatation.Status ());}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}:"Casos de uso de anotaciones
Las funciones de las anotaciones son muy poderosas, y marcos como las anotaciones de uso de primavera y hebernado en el registro y la validez. Se pueden aplicar anotaciones donde se utilizan interfaces de marcador. La diferencia es que la interfaz de etiqueta se usa para definir una clase completa, pero puede definir comentarios para un solo método, como si exponer un método como servicio.
Se han introducido muchas anotaciones nuevas en el último Servlet 3.0, especialmente aquellos relacionados con la seguridad de Servlet.
Handlestypes Esta anotación se utiliza para representar un conjunto de clases de aplicación pasadas al ServletContainerInitializer.
HttpConstraint Esta anotación representa las restricciones de seguridad para las solicitudes de solicitud de todos los métodos HTTP, y es diferente de las restricciones de seguridad HTTPMethodConstraint definidas en la anotación de ServletSecurity.
HttpmethodConstraint especifica restricciones de seguridad para diferentes tipos de solicitudes, que son diferentes de la anotación que describe el tipo de método de protocolo HTTP en la anotación de seguridad de servicio.
Multipartconfig Esta anotación está marcada en el servlet, lo que indica que el tipo MIME de la solicitud que el servlet quiere procesar es multipart/datos de forma.
ServletSecurity La anotación está marcada en la clase de herencia de servlet, y la solicitud del protocolo HTTP se ve obligada a cumplir con las limitaciones de seguridad.
WebFilter se utiliza para declarar un filtro de servidor;
WebInitParam Esta anotación se utiliza para declarar los parámetros de inicialización en el servlet o filtro, y generalmente se usa con @WebServlet o @WebFilter.
WebListener Esta anotación es un tipo diferente de oyente de declaración de eventos en el contexto de la aplicación web.
WebServlet Esta anotación se utiliza para declarar la configuración de un servlet.
ADF (marco de aplicaciones) y anotaciones
Ahora comenzamos a discutir la última parte del artículo. El marco de aplicaciones, conocido como ADF, es desarrollado por Oracle para crear aplicaciones convergentes de Oracle. Hemos entendido las ventajas y desventajas de las anotaciones y sabemos cómo escribir anotaciones personalizadas, pero ¿a dónde debemos aplicar las anotaciones? ¿ADF proporciona algunas anotaciones simples? Una buena pregunta, de hecho, hay algunas limitaciones en el uso de anotaciones en ADF. Los marcos de aplicaciones mencionados anteriormente, como Spring y Hibernate, usan AOP (programación orientada a los laterales). En AOP, el marco proporciona un mecanismo para inyectar código en el preprocesamiento y el procesamiento posterior de los eventos. Por ejemplo: tiene un gancho para agregar código antes y después de la ejecución del método, para que pueda escribir su código de usuario en estos lugares. ADF no usa AOP. Si tenemos algún caso de uso para la anotación disponible, es posible que necesitemos implementarlo a través de la herencia.
¡Espero que les guste este artículo para ayudarlo a comprender mejor el significado de la anotación!