Идентификаторы хорошо определены Спецификацией языка 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, похоже, не соблюдает это правило, позволяя нам называть функцию, начинающуюся с чисел, в Bytecode?
Этот простой фрагмент фактически напечатает имя метода 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"?