2015-06-22 6 views
1

Конечно, я не читал ничего фундаментального, и это кажется очень странным, но мне интересно.Что это за первый, аннотированный класс (яйцо) или используемый класс (курица)?

Предположим, вы используете

@SharedPref 
public interface SharedPreferencesInterface { 
    @DefaultBoolean(true) 
    boolean showDeviceName(); 

У меня есть IDE (идея), сконфигурированный с Gradle, и я создал класс SharedPreferencesInterface_, который можно использовать в другом классе, как

@Pref 
SharedPreferencesInterface_ prefs; 

Но предположим, что кто-то сейчас скачать проект, как можно использовать? Поскольку класс, в котором используется SharedPreferencesInterface_, не компилируется, потому что класс не существует, а класс не существует, потому что ошибки компиляции ...

Как это сделано? Конечно, есть способ ... настроить сначала компиляцию определенных классов?

Справка приветствуется.

Приветствие.

+0

Я ответил на ваш вопрос в целом. Но я не уверен, что вы действительно хотите спросить. Приведенный выше пример не работает; или это так, но вам любопытно, почему? – WonderCsabo

ответ

2

Но предположим, что кто-то сейчас загружает проект, как его использовать? Поскольку класс, где используется SharedPreferencesInterface_ не компилируется, поскольку класс не существует, а класс не существует, потому что ошибки компиляции ...

Это та же самая ситуация, когда вы собираете проект в полной сборке (когда классы еще не созданы). Фактически Gradle всегда делает полную сборку в настоящее время в проектах Android. Никакой конфигурации не требуется вообще в дополнение к standard AndroidAnnotaions config.

На самом деле это работает, потому что компилятор не полностью компилирует ваш класс перед передачей его обработке аннотаций. Понятно, что этого не следует, поскольку класс может ссылаться на сгенерированные классы, которые доступны только после обработки. Поэтому сначала компилятор создает модель классов, только анализирует структуру их (поля, методы, типы возвращаемых данных, типы параметров и т. Д.), Но не реализации. Также он позволяет пропускать типы даже в полях. Если он обнаруживает недостающий тип, он присваивает TypeKind.ERROR, но имя типа все еще доступно для обработчика аннотации. После того, как процессор завершен, он генерирует отсутствующий класс, поэтому тип класса больше не TypeKind.ERROR, и компиляция может быть успешной.

+0

Привет, одна ночь, проведенная с этим ... :(и проблема была в том, что я был neebie с андроид-студией и градиентом и apt ... (я пришел из java и eclipse :) Я пытаюсь построить студию android в gradle this sample code http://www.ti.com/tool/wifistarter, и я ставлю зависимость от 3.3.3 аннотаций android, и этот код пришел из 2.7 с различным пространством имён импорта, из-за чего не компилируется ... я меняю все импорт и работает Совершенно. Мне не хватало somethig;) – accreativos

+0

Я рад, что вы это решили. Хорошо знать, что этот инструмент использует AA. :) Отказ от ответственности: я сторонник AndroidAnnotations. – WonderCsabo

+0

Да, я знаю, кто вы, я просмотрел ваш профиль;) из-за того, что я сказал, какой proyect (TI) использовал его ... – accreativos

 Смежные вопросы

  • Нет связанных вопросов^_^