Я экспериментирую с процессорами аннотаций Java и пытаюсь понять использование классов в "javax.lang.model". Из того, что я прочитал, я думаю, что ElementVisitor должен стать основным способом работы с моделью. Но я не понимаю, как правильно его использовать.
Я знал схему посетителей. До сих пор я использовал его, чтобы избежать итерации дочерних элементов (и дочерних элементов дочерних элементов ...) и избежать уродливых тестов "instanceof". Но этот посетитель кажется другим. Если я называю «принять» на элементе модели, он не посещает дочерние элементы, а только сам элемент.
Может ли кто-нибудь оказать помощь в использовании API?
Я нашел следующую ссылку: http://www.cs.bgu.ac.il/~gwiener/programming/visitors-galore/#more-113. Но использование одного посетителя внутри другого внутри другого ... просто чувствую, что не прав!?
Редактировать : Чтобы было легче понять вопрос, я скопировал код по ссылке выше. Следующий код не кажется «правильным». Я не могу поверить, что официальный Java-API разработан таким образом. Но как правильно использовать ElementVisitor?
tElem.accept(new SimpleElementVisitor6<Void, ...>() {
public Void visitType(TypeElement e, ...) {
for (Element tSubElem : e.getEnclosedElements()) {
tSubElem.accept(new SimpleElementVisitor6<AssocEndSpec, ...>() {
public AssocEndSpec visitExecutable(ExecutableElement ex, ...) {
TypeMirror tRetTypeMirror = ex.getReturnType();
tRetTypeMirror.accept(new SimpleTypeVisitor6<TypeElement, TypeElement>() {
public TypeElement visitDeclared(DeclaredType t, TypeElement enclose) {
for (TypeMirror tTypeArgMirror : t.getTypeArguments()) {
tTypeArgMirror.accept(new SimpleTypeVisitor6<TypeElement, ...>() {
public TypeElement visitDeclared(DeclaredType t, TypeElement self) {
TypeElement tArgTypeElem = (TypeElement) t.asElement();
if (!self.equals(tArgTypeElem)) {
// found the little bugger!
}
}
}, ...);
}
}
}, ...);
}
}, ...);
}
}, ...);