Я работаю над обработчиком аннотаций. Этот код компилируется:
package sand;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.TypeElement;
@SupportedAnnotationTypes("sand.Foo")
public class FooProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
return false; // TODO
}
}
Тем не менее, я недоволен строковой константой "sand.Foo" (в данном случае это не так уж и много, но в целом для будущего).
Если Foo
переименовано или перенесено в другой пакет, этот код все равно будет компилироваться, но он не будет работать.
Я хотел бы сделать что-то вроде:
@SupportedAnnotationTypes(Foo.class)
Таким образом, если имя Foo изменяется, компиляция завершится неудачно, и кто-то должен будет исправить файл.
Но это не работает, потому что Class
не является String
. Поэтому я попробовал:
@SupportedAnnotationTypes(Foo.class.getName())
Но компилятор не считает это постоянным выражением, которое требуется в этом контексте, так что это тоже не сработает.
Есть ли способ принудить литерал класса к его имени во время компиляции?