понедельник, 8 февраля 2010 г.

Интересный момент компиляции кода с помощью javassist

Если вы собираете класс в runtime с помощью javassist, вам наверняка будет интересно узнать, в каком месте кода у вас ошибка (например, если вы даете ей на вход тело метода).
В работе с javassist обнаружилось несколько интересных моментов:
1) компилятор не знает, что такое for (each).
2) парсер не проверяет код (только явные ошибки).
3) верификатор jvm кода не сообщает положения ошибки.

Таким образом, вы вправе передать компилятору на вход вот такое: { call() = 1; }... и он это прожует. То есть, вы не получите на выходе SyntaxError исключение. Вместо этого, вы получите исключение верификатора jvm VerifyError, которое будет содержать нечто вроде: в вашем методе ... с такой-то сигнатурой ... на вершине стэка ожидалось интовое значение. Выяснить место ошибки автоматически - не получится.

Комментариев нет:

Отправить комментарий