Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在APT中访问@XmlElement值?_Java_Annotations_Jdk1.6_Apt_Annotation Processing - Fatal编程技术网

Java 如何在APT中访问@XmlElement值?

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

我在编译时使用APT处理注释,需要在某些类中获取
@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
[...]