2011-09-05 19 views
6

Tenemos una gran base de código y algunas clases se utilizan a menudo mediante la reflexión en todo el código. Podemos eliminar clases de forma segura y el compilador está contento, pero algunos de ellos se usan dinámicamente mediante la reflexión, por lo que no puedo encontrarlos de otra manera que buscando cadenas ...Java: busque el uso del código de reflexión

¿Hay algún explorador de reflexión para el código de Java?

+0

cómo están las clases que se utilizan de forma dinámica son cargaron usando su nombre completo como una cadena o ser utilizado en un guión que es evaluar en tiempo de ejecución? –

+0

nombre completo como cadena – Xorty

+0

Evite hacer eso si es posible. La razón por la cual los lenguajes seguros como Java son tan poderosos y usados ​​en sistemas empresariales es que la verificación del tipo de tiempo de compilación puede encontrar la mayoría de los conflictos de tipo en tiempo de compilación, excepto si usa el reflejo para hacer ciertas cosas, entonces todas las apuestas están apagadas y usted vuelve a las edades oscuras de la programación donde su código está integrado con 'minas' que pueden activarse en cualquier momento cuando uno de sus usuarios simplemente ejercita una parte del código de una manera que no había pensado probar. – Volksman

Respuesta

3

Sugiero, utilizando una fuente de licencia apropiada para su JRE, modificar las clases de reflexión para registrar cuando las clases se usan por reflexión (use un mapa/WeakHashMap para ignorar duplicados). Sus clases de sistema modificadas pueden reemplazar aquellas en rt.jar con -Xbootclasspath/p: en la línea de comando (en Oracle "Sun" JRE, otras presumiblemente tendrán algo similar). Ejecute su programa y prueba y vea qué surge.

(Posiblemente puede que tenga que cortar alrededor cuestiones con el fin de carga de clases en las clases del sistema.)

+0

Pero esto solo encontrará lo que se ha cargado en esa ejecución particular del programa. Lo que sugerí fue hacer lo mismo estáticamente, y no es necesario pasar por el dolor de modificar las clases. Interesado en tus comentarios Gracias. –

+1

@Hemal Tipo de depende de qué reflexión se está utilizando. Los usos más útiles de la reflexión no tendrían las cadenas codificadas. Si las cadenas están codificadas, entonces no sugiero que se grepping para 'java.lang.reflect' y eliminar el reflejo. –

4

No es una herramienta sencilla para hacer esto. Sin embargo, puedes usar cobertura de código en su lugar. Lo que esto hace es darle un informe de toda la línea de código ejecutada. Esto puede ser incluso más útil para mejorar el código de prueba o eliminar el código muerto.

reflexiones es, por definición, muy dinámico y hay que ejecutar el código de la derecha para ver lo que iba a hacer. es decir, debe tener pruebas razonables. Puede agregar el registro a todo lo que Reflection hace si puede acceder a este código, o quizás puede usar la instrumentación de estas bibliotecas (o cambiarlas directamente)

0

Dudo que dicha utilidad esté disponible, pero podría estar equivocado.

Esto es bastante compleja, teniendo en cuenta que las clases cargadas dinámicamente (a través de la reflexión) se puede cargar a sí mismos otras clases dinámicamente y que los nombres de las clases cargadas puede provenir de variables o alguna entrada tiempo de ejecución.

Su código base probablemente no haga ninguno de estos. Si se trata de un esfuerzo de búsqueda de una sola vez puede ser una buena opción. O busca llamadas a métodos de reflexión.

0

Como han mencionado los otros carteles, esto no se puede hacer con el análisis estático debido a la naturaleza dinámica de reflexión. Si está utilizando Eclipse, puede encontrar que esta herramienta de cobertura es útil y es muy fácil trabajar con ella. Se llama EclEmma

Cuestiones relacionadas