Вы не можете получить доступ к классу, обработанному обработчиком аннотации, потому что класс еще не скомпилирован. Вместо этого Java предлагает аналогичные элементы api для проверки стиля отображения источника.
Элемент (который вы нашли с помощью roundEnv.getRootElements()
) имеет гораздо больше информации о компилируемом классе, чем просто его имя. Много полезной информации можно найти с помощью ElementVisitors:
http://docs.oracle.com/javase/6/docs/api/javax/lang/model/element/ElementVisitor .html http://docs.oracle.com/javase/6/docs/api/javax/lang/model/util/ElementKindVisitor6.html
Включая конструкторы классов, методы, поля и т. д.
Вот как это использовать:
public class AnnotationProcessor extends AbstractProcessor {
......
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
Set<? extends Element> rootE=roundEnv.getRootElements();
for(Element e: rootE) {
for(Element subElement : e.getEnclosedElements()){
subElement.accept(new ExampleVisitor(), null); // implement ExampleVisitor
}
}
}
}
Class<?>
во время обработки, потому что классы, которые вы хотите, должны быть скомпилированы прямо сейчас! Если вы вызываете getClass()
в неизвестном классе или используете Class<?> clazz = Class.forName("com.your.fancy.Class")
, вы получите java.lang.ClassNotFoundException
, который полностью прекрасен. javax.lang.model.element.Element
и javax.lang.model.element.ExecutableElement
, чтобы описать / читать определения классов. javax.lang.model.*
имеет javax.lang.model.type.TypeMirror
для описания классов, их полей, методов и т. д. ClassNotFoundException
даже после того, как roundEnvironment.processingOver()
будет правдой. Примеры:
public static @Nonnull List getMethods(@Nonnull Element annotationElem, @Nonnull RoundEnvironment roundEnvironment) {
List outList = new ArrayList();
String simpleName = annotationElem.getSimpleName().toString();
for (Element elem : roundEnvironment.getRootElements())
if (elem.getSimpleName().toString().equals(simpleName))
for (Element methodDeclaration :elem.getEnclosedElements())
if (methodDeclaration instanceof ExecutableElement)
outList.add((ExecutableElement)methodDeclaration);
return outList;
}
public static TypeMirror getMethodFirstParam(@Nonnull ExecutableElement method, int n) {
List parameters = ((ExecutableElement) method).getParameters();
if (parameters != null && parameters.size() > 0)
return parameters.get(n).asType();
return null;
}