Cómo implementar la retención de anotación específica acumulación en Java

Lukas Eder:

Tengo una anotación que utilizo actualmente sólo para fines de construcción y documentación interna. No ofrece ningún valor en tiempo de ejecución, por lo que he elegido @Retention(SOURCE):

@Retention(SOURCE)
public @interface X

Sin embargo, con el fin de validar su uso adecuado, me gustaría poner en práctica una prueba de unidad que navega a toda la API para comprobar si se aplica la anotación de todo el mundo se debe aplicar a. Esa prueba unitaria sería bastante fácil de implementar mediante el uso de las API de Java ordinarias de reflexión, pero no puedo hacer eso ya que las pruebas no pueden reflejar sobre la anotación, dada su @Retention(SOURCE).

Con el fin de utilizar la reflexión en las pruebas, que tendría que cambiarlo a @Retention(RUNTIME), que me gustaría evitar debido a la sobrecarga de código de bytes en tiempo de ejecución.

Soluciones provisionales Soy consciente de:

Hay soluciones como siempre. Estoy al tanto de estos:

  • Podríamos utilizar un procesador de anotación que falla la compilación en lugar de ejecutar pruebas unitarias. Esto es factible, pero menos óptima, ya que las pruebas son muy sofisticados y mucho más difíciles de implementar el uso de procesadores de anotación en lugar de las pruebas unitarias utilizando ambas API junit y la cantidad de API de reflexión más conveniente. Me gustaría utilizar esta solución sólo como un último recurso.
  • Podríamos cambiar el @Retentionque RUNTIMEen nuestras fuentes, construir las fuentes de estas pruebas adicionales, luego pre-procesar la API para eliminar la retención de nuevo, y luego construir la API una segunda vez para su uso en producción. Se trata de una solución molesto, ya que complicaría y ralentizar la construcción.

Pregunta:

¿Hay una manera más conveniente para retener la anotación en tiempo de ejecución sólo para pruebas, pero no en el archivo jar en realidad construida, utilizando Maven?

Stuart Marcas:

Aquí hay un enfoque híbrido que el trabajo de fuerza.

Escribir un procesador de anotación que no implementa la prueba completa que desea hacer, sino que se limita a registrar en un archivo sidecar donde se produjeron las anotaciones. Si va a anotar las clases, métodos y campos, la ubicación puede ser grabada relativa facilidad a utilizar el nombre de clase calificado por paquete además de un descriptor de método o campo. (Esto puede ser más difícil, sin embargo, si su anotación puede aparecer en los lugares más oscuros, como en los parámetros del método o en sitios de uso de tipos.) A continuación, se puede mantener la política de retención como SOURCE.

A continuación, escribir sus pruebas JUnit para hacer lo que el análisis reflexivo que está con la intención de hacer. En lugar de tratar de encontrar las anotaciones reflexivamente, aunque (ya que no estarán allí) leído en el archivo sidecar y mirar allí.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=183376&siteId=1
Recomendado
Clasificación