Java 如何在APT中访问@XmlElement值?
我在编译时使用APT处理注释,需要在某些类中获取Java 如何在APT中访问@XmlElement值?,java,annotations,jdk1.6,apt,annotation-processing,Java,Annotations,Jdk1.6,Apt,Annotation Processing,我在编译时使用APT处理注释,需要在某些类中获取@xmlement注释的值。这个类看起来像这样: public class ComponentConfig { @XmlElements({ @XmlElement(type = Sample1.class, name = "sample-1-config"), @XmlElement(type = Sample2.class, name = "sample-2-config"), @Xml
@xmlement
注释的值。这个类看起来像这样:
public class ComponentConfig {
@XmlElements({
@XmlElement(type = Sample1.class, name = "sample-1-config"),
@XmlElement(type = Sample2.class, name = "sample-2-config"),
@XmlElement(type = Sample3.class, name = "sample-3-config"),
})
//...
}
我想获取@xmlement
的名称
值,但以下处理器代码无法为我获取该值:
List<? extends AnnotationMirror> annotationMirrors = element.getAnnotationMirrors();
for (AnnotationMirror mirror : annotationMirrors) {
if (mirror.getAnnotationType().toString().equals(XML_ELEMENT)) {
System.out.println(getAnnotationValueMapValueOfName(mirror));
nodes.add(getAnnotationValueMapValueOfName(mirror));
}
}
List在哪里定义了XML\u元素?它至少应该是一个完全限定的名称
使用getAnnotationType()
如果打印出找到的所有getAnnotationType().toString()
的值,您可能会发现问题
还应该使用javax.annotation.processing
包,因为APT现在已被弃用(因为它最近已从即将发布的JDK8-IIRC的构建中删除)。它使用起来更方便,并且受到所有JDK6+实现的支持。它不太合适,但它可以与JDK6+的
@Override
public boolean process(final Set<? extends TypeElement> annotations,
final RoundEnvironment roundEnv) {
checkEnvironmentChange();
System.out.println(" > ---- process2 method starts " + hashCode());
System.out.println(" > annotations: " + annotations);
for (final TypeElement annotation: annotations) {
System.out.println(" > annotation: " + annotation.toString());
processAnnotation(roundEnv, annotation);
}
System.out.println(" > processingOver: " + roundEnv.processingOver());
System.out.println(" > ---- process2 method ends " + hashCode());
return false;
}
private void processAnnotation(final RoundEnvironment roundEnv,
final TypeElement annotation) {
final Set<? extends Element> annotateds =
roundEnv.getElementsAnnotatedWith(annotation);
for (final Element element: annotateds) {
processElement(element);
}
}
private void processElement(final Element element) {
System.out.println(" > class: " + element);
System.out.println(" > class2: " + element.getClass());
final List<? extends Element> enclosedElements =
element.getEnclosedElements();
for (final Element enclosedElement: enclosedElements) {
processEnclosedElement(enclosedElement);
}
}
private void processEnclosedElement(final Element enclosedElement) {
final XmlElements xmlElements =
enclosedElement.getAnnotation(XmlElements.class);
if (xmlElements == null) {
return;
}
final XmlElement[] xmlElemntValues = xmlElements.value();
for (final XmlElement xmlElementValue: xmlElemntValues) {
System.out.println(" > name: " + xmlElementValue.name());
}
}
我的前一个问题也有帮助:+1,很高兴知道APT已被弃用。我刚找到一篇关于它的博客:
[...]
> annotations: [hu.palacsint.annotation.MyAnnotation]
> annotation: hu.palacsint.annotation.MyAnnotation
> class: hu.palacsint.annotation.p2.ClassTwo
> class2: class com.sun.tools.javac.code.Symbol$ClassSymbol
> name: sample-1-config
> name: sample-2-config
> name: sample-3-config
> processingOver: false
[...]