Могу ли я перейти от TypeVariable или VariableElement к списку методов базового класса в процессоре аннотаций во время компиляции
У меня есть аннотированный класс:
public class CacheMessageHolder<TestMessage> implements MessageHolder<TestMessage> {
protected @MessageHolderType TestMessage message;
@Override
@SendProtoAll (proto ="protoMessageClass", matchType=MatchType.PARTIAL)
public void setMessage( TestMessage msg) {
this.message = msg;
}
}
В моем обработчике аннотаций я хочу получить список методов получения объекта Object, переданных в метод setMessage, и эта информация будет затем использована для генерации кода.
Я расширяю ElementScanner6 и получаю VariableElement, который, кажется, содержит параметр, но я не знаю, куда идти дальше.
Поэтому в этом примере я хочу получить все методы класса TestMessage во время компиляции.
Есть идеи
1 ответ
Обработка аннотаций довольно громоздка, и можно довольно быстро потеряться. Я думаю, что вы должны получить тип, соответствующий этому элементу параметра, затем получить элемент, соответствующий этому типу, затем получить его члены и отфильтровать их. Попробуйте поиграть со следующим кодом, и дайте мне знать, если он работает:
VariableElement parameterElement;
ProcessingEnvironment processingEnv;
TypeMirror parameterType = parameterElement.asType();
Types typeUtils = processingEnv.getTypeUtils();
TypeElement typeElement = (TypeElement) typeUtils.asElement(parameterType);
Elements elementUtils = processingEnv.getElementUtils()
List<? extends Element> elementMembers = elementUtils.getAllMembers(typeElement);
List<ExecutableElement> elementMethods = ElementFilter.methodsIn(elementMembers);
for(ExecutableElement methodElement : elementMethods) {
if (methodElement.getParameters().size()==0 && methodElement.getSimpleName().toString().startsWith("get")) {
// do something
}
}
Я думаю, что это должно работать, но я не уверен на 100%, что это геттер, так как вы не можете проверить, что сделано внутри тела метода. Я предположил, что под "getter" вы подразумевали метод, начинающийся с "get" и не имеющий параметров.
Это отвечает на ваш вопрос?