PHP interperts el código, lo que significa que se ejecuta sobre la fuente cada vez que ejecuta el programa. Esto tiene la ventaja de explotar cuando se lee el código (lo que hace que las impresiones del número de línea sean triviales); sin embargo, a menudo es costoso en otras formas, ya que no se puede optimizar en profundidad (o hacer ninguna comprobación de error previa al tiempo de ejecución).
Java compiles its code into a JVM assembly language called "bytecode." Esto significa que lo que se está ejecutando generalmente no tiene acceso (o incluso usa) el código fuente. Dicho eso, hay técnicas. Una clase Java compilada tiene la capacidad de agregar "datos adicionales" y uno de esos "elementos de datos adicionales" es a line number table, que es un índice que permite que alguien ejecute el ensamblado para "buscar" el número de línea ya que el compilador lo registró.
En general, esto funciona bien, con las consideraciones que: compiladores a menudo no se marcan cada instrucción, el código fuente puede no estar disponible, la optimización puede hacer que ciertos trozos interiores de código no funciona de manera que facilite apuntando a la entrada código de texto.
cómo las herramientas de cobertura de código "arreglar" esto es que por lo general se insertan en el código (en el plano de montaje) un gran número de comandos que actúan efectivamente como declaraciones de registro en un formato que permite la herramienta para determinar cuál es el camino a través de la el código fue realmente seguido. Esto se correlaciona a través de la tabla de números de línea de la mejor manera posible y luego se usa para resaltar las líneas dentro del archivo fuente original.
Si quiere algo con una resolución más fina (algo que pueda procesar qué parte de una línea se ejecutó), entonces necesita profundizar más. Eventualmente, incluso podría considerar escribir su propio compilador (o extensión del compilador) que almacenará su propia tabla de números de líneas personalizadas que supera las deficiencias de las soluciones actuales.
Trucos como arrojar excepciones (como Shiven ha mencionado) y analizar el número de línea funcionan; sin embargo, contaminan su código con el procesamiento de excepción impar para los elementos que realmente no son excepcionales, solo para "obtener el número de línea". Debido al desorden del código y al rendimiento de las excepciones en el tiempo de ejecución generalmente más pobre, tiendo a evitar tales soluciones (pero funcionan).
De todos modos, con suerte esto le dará una visión de por qué no siempre funciona exactamente de la misma manera que PHP.
Si realmente desea hacerse elegante con los números de línea _sin excepciones_ lanzando, puede escribir su propio 'ClassLoader' que podría proporcionarle una facilidad para obtener la tabla de números de línea; sin embargo, es posible que también necesite escribir su propia extensión en 'Thread' para tener una interfaz utilizable con la instrucción actual de bytecode de JVM. Es factible, ya que el lanzamiento de excepciones ya lo hace por usted, pero es mucho trabajo para algo que generalmente no es necesario con un registro estructurado de manera diferente. –
¡Gracias por esto! Entiendo la diferencia entre los lenguajes compilados e interpretados y sé que obtener los números de línea para Java ejecutado (o cualquier lenguaje compilado) no es exactamente trivial. He decidido ir con Cobertura para generar el informe. Nunca he usado una herramienta de cobertura de código antes, así que esto me tomará un tiempo descifrar. Vea el comentario debajo de esta publicación. La ayuda sería muy apreciada. ¡Muchas gracias! – DanB91