2012-06-15 14 views
10

Entre Java 5 y Java 6, las reglas con respecto a las anotaciones @Override para métodos que se originan en interfaces (a diferencia de las superclases) se cambiaron, antes de que no se permitieran, pero después de que lo fueran. Sin embargo, no son requerido por javac.¿Cómo puedo detectar estáticamente las anotaciones @Override que faltan?

Algunos IDEs, como Eclipse, pueden generar errores o advertencias sobre las omisiones que faltan. Estoy buscando cualquier tipo de herramienta de análisis estático que pueda detectar las anulaciones faltantes, así puedo informar/bloquearlas programáticamente.

No parece que ninguno de los grandes que conozco como findbugs, et al pueda hacerlo, probablemente porque @Override solo tiene nivel de retención de fuente, por lo que no está presente en los archivos .class en los que estas herramientas operar, y las herramientas de nivel de origen como checkstyle no comprenden la jerarquía de clase completa.

+0

Cuando invoco checkstyle no hay lugar para un classpath. Eso está bien para las comprobaciones de estilo de cheque, pero ¿cómo comprobaría checkstyle mi 'void doStuff()' anula el método 'void doStuff()' sin tener tus clases (ya sea en el origen o classpath). – emory

+0

Sí exactamente, por lo que incluso aparte del problema de retención en tiempo de ejecución, checkstyle solo está haciendo comprobaciones "locales" en un archivo y es probable que no pueda detectarlo. – BeeOnRope

+0

No entiendo por qué la retención es un problema. El corrector necesitará acceder a su código fuente y a los archivos de clase de sus dependencias. No necesitará acceder al código fuente de sus dependencias. (Si encontró un '@ Override' faltante en el código fuente que no tiene privilegios de escritura, ¿qué haría?) – emory

Respuesta

3

Puede simplemente habilitar una acción de guardado en Eclipse para agregar automáticamente la anotación @Override que falta - ver Ventana> Preferencias> Editor de Java> Acciones de guardar> Código faltante> Agregar anotaciones faltantes.

+0

Sí, pero el problema está en un entorno con muchos IDE diferentes y entornos de desarrollo que no son IDE, no se puede garantizar que todos lo hagan. Mi objetivo es detectar casos en los que faltan, no cambiar las herramientas de desarrollo existentes para garantizar que faltan menos. – BeeOnRope

+0

Bueno, en la pregunta que dices "para evitar que entren en nuestra base de códigos en primer lugar". Entonces no estoy seguro de lo que quieres. –

+0

Tal comprobación podría realizarse en un sistema de "preinscripción" que valida la fuente antes de que ingrese al repositorio principal de origen. En cualquier caso, esa parte no es realmente relevante, así que la eliminaré/aclararé. Solo necesito una herramienta automatizada que pueda detectar estos problemas. – BeeOnRope

1

Obviamente, necesita algo que procese el código fuente de Java y le dé acceso a las estructuras de código y los atributos.

Entiendo que Eclipse tiene algunas máquinas de análisis en JDT, y es posible que pueda usar eso.

Nuestro DMS Software Reengineering Toolkit tiene un analizador de código fuente completo de Java (incluida la captura de atributos), nombre completo y resolución de tipo, y la capacidad de leer muchos archivos de origen a la vez. DMS está diseñado para permitirle crear su propia herramienta de análisis personalizada, por lo que puede definir las condiciones en las que insiste en que los atributos estén presentes o no.

Dado que DMS también proporciona capacidad de transformación de programas, incluso puede definir reglas de personalización que modificarán el código fuente donde esté claro qué atributos deberían estar presentes.

DMS y las reglas de idiomas de Java no son triviales; esto requiere un poco de esfuerzo para configurarlo. Pero si realmente tiene miles de desarrolladores, este costo se ve abrumado por la incapacidad de controlar lo que están haciendo, por lo que la inversión tiene sentido.

0

JArchitect podría resolver su problema mediante el uso de CQLinq y la solicitud exceute como esto

de t en donde Tipos! T.HasAnnotation ("Anulación") seleccione t

Y por supuesto se puede personalice su consulta como desee para agregar otros criterios.

Cuestiones relacionadas