Есть ли способ использовать статический анализ кода, чтобы определить, все ли поля определенного типа имеют аннотацию? - PullRequest
2 голосов
/ 03 июня 2011

У меня есть несколько POJO, которые используются для перемещения данных в моем приложении и его веб-сервисах.Мы только что ввели аннотацию, чтобы помочь нам проверить, что поля String в этих POJO имеют определенную длину.Это позволяет нам проверять POJO вместо того, чтобы ждать, пока слой базы данных вытянет исключение, когда оно будет сохраняться.

Теперь я хотел бы провести анализ этих объектов, который скажет мне, какие поля являются строками, которыеесть эта новая аннотация.Я хочу сделать это, чтобы получить список полей, у которых нет этой аннотации, чтобы ее можно было сравнить с соответствующим полем БД и добавить аннотацию с правильной длиной в качестве параметра.

Нет, мы не можем получить лучшую корреляцию между нашими POJO и объектами нашей базы данных.

Нет, наши объекты базы данных не имеют такой проверки.Мы действительно хотим, чтобы эта проверка выполнялась в POJO, поскольку она проще проверять и сообщать о недействительных данных во время выполнения.

Существует ли какой-либо инструмент статического анализа, который помог бы мне с этой задачей?

Ответы [ 2 ]

1 голос
/ 03 июня 2011

Конечно.

Разбор кода Java.Прогулка по АСТ.Найдите интересующие вас области (может потребоваться, чтобы вы также делали разрешение имен и типов («таблицы символов»), чтобы вы могли указывать свои поля из произвольных других полей) в AST для ваших классов, и проверьте AST на наличие необходимой аннотации.1003 *

Вы можете сделать это с любым анализатором Java AST (и распознавателем имен).Я думаю, что Затмение может обеспечить это.Наш DMS Software Reingineering Toolkit может сделать это. ANTLR , похоже, имеет синтаксический анализатор Java, но я сомневаюсь, что у него есть разрешение имени и типа Java.

0 голосов
/ 06 июня 2011

Я решил использовать аннотации для нужд проверки во время выполнения, а затем создал модульный тест, чтобы убедиться, что все поля были аннотированы. Это было вдохновлено @ c0mrade .

Итак, аннотация @Length и требует целочисленного параметра. Во время выполнения валидатор перебирает поля и ищет аннотацию @Length и проверяет, применена ли она к полю String. Затем он смотрит на длину значения Strings и проверяет, что он меньше или равен параметру для аннотации.

В модульном тесте я загружаю все классы для моих POJO по пакетам. Затем я перебираю эти классы, перебираю поля каждого класса и, наконец, проверяю, является ли поле строкой и имеет ли назначенную аннотацию @Length. Если поле является строкой и не имеет @Length, оно добавляет класс и имя поля в список строк. Утверждение для теста состоит в том, что этот список пуст.

...