Я работаю над процессором аннотаций. Этот код компилируется:
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())
Но компилятор не считает это константным выражением, которое требуется в данном контексте, так что это тоже не сработает.
Есть ли способ принудить литерал класса к его имени во время компиляции?
Class
вместоString
? - person chrylis -cautiouslyoptimistic-   schedule 15.01.2015String...
в качестве входных данных. - person k_g   schedule 15.01.2015Class
и использовать процессор для генерации кода выше? - person chrylis -cautiouslyoptimistic-   schedule 15.01.2015Is there any way to coerce a class literal into its name at compile time?
- нет, извините, но см. ответ капепа для хорошей альтернативы. - person gknicker   schedule 15.01.2015