Como a JVM pega a linha do .class?

Olá,

Só uma questão interessante que gostaria de discutir com vocês, se alguém sabe. Usando reflections tenho como pegar em que linha está um método específico de um .CLASS. Assim como quando dá um erro ele sabe exatamente a linha. Ex: (NullPointer exc. on line 6). O grande negócio é: como isso funciona? Antes de mandar pro .CLASS ele nao converte pro bytecode direto. Tanto que se eu tentar decompilar um .class vou receber uma série de coisas não interessantes em alguns casos.

Agora, como diabos será que ele marca a linha?

Obrigado!

Quando você compila os códigos com a opção -g, várias informações de debug são deixadas como nome dos parametros de métodos, linha do .java e afins.

Os decompiladores usam essas informações para transformar .class em .java novamente.

Abs

O bytecode guarda a linha original onde estava o código. Exemplo:

public AlreadySelectedException(java.lang.String message); 0 aload_0 [this] 1 aload_1 [message] 2 invokespecial org.apache.commons.cli.ParseException(java.lang.String) [1] 5 return Line numbers: [pc: 0, line: 37] [pc: 5, line: 38] Local variable table: [pc: 0, pc: 6] local: this index: 0 type: org.apache.commons.cli.AlreadySelectedException [pc: 0, pc: 6] local: message index: 1 type: java.lang.String