2016-07-06 10 views
0

Я играю с Java-обработчиками аннотации с отличными результатами. Теперь я хотел бы сделать следующее, что, насколько я могу судить, невозможно.Java Аннотации Процессор для анализа выражений?

У меня есть несколько классов, которые реализуют шаблон Builder. Скажем, например

new FooBuilder().doSomething("A").doSomethingElse("B").execute(); 

Очень важно, что «цепочка» из вызовов метода завершается использованием execute() метода. В противном случае строитель в основном ничего не сделает.

Поэтому я хотел использовать JAP для проверки наличия метода execute() для определенных типов выражений во время компиляции. К сожалению, кажется, что самая тонкая информация, которую я могу получить, - это уровень декларации метода, а не выражения.

Является ли это тем, что я хочу вообще?

+0

Ans, что произойдет, если пользователь сделает что-то вроде этого: 'FooBuilder fb = new FooBuilder(). DoSomething (« A »). DoSomethingElse (« B »);/* сделать что-то еще */fb.execute(); '? –

+0

В этом случае назначение может служить оправданием отсутствия 'execute()'. Но вы правы, это не безупречно. Тем не менее, он мог поймать множество основных случаев. – geert3

ответ

2

Стандартные аннотационные процессоры Java обеспечивают обратный вызов только при объявлениях, таких как декларации метода и поля.

Для анализа выражений можно использовать обработчик аннотации, но это немного больше. Вам нужно будет написать обработчик аннотации, который по каждому методу получит AST (абстрактное синтаксическое дерево или дерево разбора) для этого метода, а затем посещает каждое выражение в методе. AST является специфичным для компилятора.

Два самых известных проекта, которые делают это: Checker Framework и Project Lombok. Возможно, вы могли бы вдохнуть вдохновение из своих реализаций или даже написать свой обработчик аннотации поверх одного из них.