JVM не проверяет корректность целочисленных значений перед передачей в метод. Пишем маленький класс: Код (Text): public class A { public static void x(byte b){ System.out.println(b); } public static void main(String args[]){ x((byte)100); } } Компилируем, открываем в редакторе байткода и заменяем в методе Main bipush 100 на sipush 1000: Код (Text): sipush #1000 invokestatic void A.x(byte) return Запускаем: D:\dev>java -cp . A 1000 Таким образом, в методе, получающем БАЙТ, параметр по факту может быть int-ом Естественно, т.к. в JVM из целочисленных только тип int, то проверять валидность диапазона никто не будет. Но насколько это "легально"? как согласуется с референсом? У кого какие мысли?
scf В JVM Spec написано следующее (раздел 2.6.8 Method Invocation Conversion): Method invocation conversion is applied to each argument value in a method or constructor invocation: the type of the argument expression must be converted to the type of the corresponding parameter. Method invocation contexts allow the use of an identity conversion (§2.6.1), a widening primitive conversion (§2.6.2), or a widening reference conversion (§2.6.4). Method invocation conversions specifically do not include the implicit narrowing of integer constants that is part of assignment conversion (§2.6.7). Другими словами: возможность передачи большего значения известна, а встраивать проверку или приведение типов не стали, так как от нее в этом месте ни вреда, ни пользы.
scf Jad очень много чего декомпилирует некорректно по причине своей повсеместной кривизны И даже без всякой обфускации - несколько примеров здесь: http://stiver-rus.livejournal.com/
Я бы сказал, что такой код никто не декомпилирует корректно, поскольку соотвествующей программы на java просто не существует. А на счет декомпиляторов вообще - я еще не видел ни одного, который бы вменяемо декомпилировал обработку исключений.