Почему JVM позволяет нам называть функцию, начинающуюся с цифры в байт-коде?
Идентификаторы хорошо определеныСпецификация языка Java, Java SE 7 Edition (§3.8)
An identifier is an unlimited-length sequence of Java letters and Java digits, the
first of which must be a Java letter.
Насколько я знаю, поскольку имя метода является идентификатором, должно быть невозможно назвать метод, начинающийся с цифры в Java, иjavac
уважает это правило.
Итак, почему виртуальная машина Java, кажется, не соблюдает это правило, позволяя нам называть функцию, начинающуюся с цифр, в байт-коде?
Этот простой фрагмент на самом деле напечатаетf99()
Имя метода и значение его параметра.
public class Test {
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.f99(100));
}
public int f99(int i){
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName());
return i;
}
}
Компиляция и исполнение:
$ javac Test.java
$ java Test
Выход:
f99
100
Можно разобрать код после компиляции и переименовать всеf99
происходит99
(с помощью такого инструмента, какRej).
$ java Test
Выход:
99
100
Итак, название метода на самом деле "99"?