Implementar `nameOf` en Java introspeccionando el bytecode

Fuentes: Hacking in the 'nameOf'

El artículo muestra cómo reproducir en Java la expresión nameof de C#, que devuelve el nombre textual de un identificador para evitar duplicaciones en mensajes de validación. En lugar de añadir una característica al lenguaje, la propuesta se apoya exclusivamente en bibliotecas estándar: la API StackWalker, para localizar el marco del llamante, y la API ClassFile (Java 22+), para parsear el bytecode de la clase que invoca al método.

El mecanismo recorre las instrucciones del método llamante y simula una máquina de pila reducida: en lugar de valores reales, la pila simbólica almacena nombres de variables locales y de campos. Cada instrucción (GETSTATIC, GETFIELD, PUTFIELD, cargas y almacenes) actualiza esa pila siguiendo la semántica del operando de la JVM. Cuando la simulación alcanza la posición de bytecode correspondiente a la llamada a nameOf(arg), extrae el nombre simbólico del primer argumento y lo devuelve como cadena.

El ejemplo de uso sustituye la cadena literal del mensaje de excepción por nameOf(name), eliminando la duplicación entre el nombre del parámetro y el texto del error. No obstante, el propio autor advierte de las limitaciones: la implementación es frágil ante nuevos opcodes que afecten a la pila, depende de información de depuración que el compilador puede omitir y resulta incompatible hacia adelante con futuras versiones del JDK. La conclusión es clara: aunque técnicamente funciona, no debe usarse en producción; queda como ejercicio didáctico sobre el funcionamiento interno del bytecode de Java.