Android предоставляет support annotations, и меня особенно интересуют семейные аннотации @StringRes
, используемые для обозначения целых параметров таким образом, что вы вынуждены передавать действительные ресурсы вместо любого случайного значения.Как создать аннотацию типа моего ресурса, например @StringRes?
Использование Android Studio, я посмотрел на реализации @StringRes
и скопировать его в пользовательском класс моих в моем проекте:
package com.foo.bar.model.db;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.CLASS;
/**
* Denotes that an integer parameter, field or method return value is expected
* to be an integer resource reference (e.g. {@link android.R.integer#config_shortAnimTime}).
*/
@Documented
@Retention(CLASS)
@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE})
public @interface IntPk {
}
С этой новой @IntPk
аннотацией я хочу, чтобы пометить целые поля классов что map database целочисленные внешние ключи в надежде на то, что я не буду смешивать целочисленные значения внешних ключей из разных таблиц/классов (как таковых я бы тогда FooPk
, BarPk
и т. д. для каждого класса). Однако, когда я пишу такой код:
@IntegerRes int androidValue;
androidValue = 42;
@IntPk int customValue;
customValue = 42;
Android Студия только подчеркивает androidValue
назначение, как показано на скриншоте:
Таким образом, очевидно, что проверка выполняется что-то еще, кроме класса, определяющего аннотацию. Где это происходит? И что еще более важно, как я мог сделать те же проверки для моего настраиваемого @IntPk
, как Android SDK для @StringRes
и сохранить его в моем проекте для других разработчиков в команде, чтобы иметь тот же уровень дополнительной проверки типов?
Если ваша аннотация не является только аннотацией маркера, то одного аннотации недостаточно ... вам также нужен обработчик аннотации, вероятно, подкласс ['javax.annotation.processing.AbstractProcessor'] (https: //docs.oracle.com/javase/8/docs/api/javax/annotation/processing/AbstractProcessor.html), но это может быть любой класс, который реализует 'javax.annotation.processing.Processor'. Примечание. Я очень мало знаю о написании процессоров аннотаций. – Powerlord