5

Özel bir Anntoation işlemci yazmaya çalışıyorum. Açıklama notu ek açıklamaları kontrol etmek için her sınıf dosyasını derleme zamanında işleyecek, Ancak şu anda işlediği sınıfı nasıl alabilirim? Sadece sınıf adını aşağıdaki kodlarda bulabiliyorum.Ek Açıklama İşlemcisi - İşleniyor Sınıf nasıl alınır

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) { 
     if(e.getKind()==ElementKind.CLASS) { 
      String className= e.getSimpleName().toString(); 
      processingEnv.getMessager().printMessage(javax.tools.Diagnostic.Kind.WARNING,className, e); 
     } 
    } 
} 

cevap

7

Sınıflandırma henüz işlenmemiş olduğu için, Ek Bilgi İşlemcinin işlediği sınıfa erişemezsiniz. Bunun yerine Java, giriş kaynağının yansıtma tarzı denetimi için analog Elemanları api sunar.

Öğe (roundEnv.getRootElements() kullanarak bulduğunuz), yalnızca kendi adından daha derlenmiş olan sınıf hakkında daha fazla bilgiye sahiptir. yararlı bilgiler bir ton ElementVisitors kullanılarak bulunabilir: vb sınıfları yapıcı, yöntemler, alanlar,

İşte

nasıl kullanılacağını var dahil

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 
      } 
     } 
    } 
} 
+0

Yardımınız için teşekkür ederiz: D – user1004413

+0

"... sınıfının sadece adından daha fazla derlendiği hakkında daha fazla bilgi var" diyorsunuz, fakat sınıf adını nasıl elde edersiniz? – Matthias

+0

Sınıf adı Element.getSimpleName() içinde olacaktır. Http://docs.oracle.com/javase/7/docs/api/javax/lang/model/element/Element.html#getSimpleName%28%29 –

3
  1. Bu , değil, AnnotationProcessing nasıl çalışır. İşlemi gerçekleştirirken bir Class<?> nesnesini alamıyorsunuz, tanımını istediğiniz sınıflar doğru NOW derlenmekte! getClass()'u bilinmeyen bir sınıfta ararsanız veya Class<?> clazz = Class.forName("com.your.fancy.Class") numaralı telefonu kullanırsanız, numaralı telefonu kullanabilirsiniz. Sınıf tanımlarınızı tanımlamak/okumak için javax.lang.model.element.Element ve javax.lang.model.element.ExecutableElement gibi sınıfları kullanmanız gerekir.
  2. javax.lang.model.*javax.lang.model.type.TypeMirror sınıfları, tarlalarını, sen daha fazla fikir gerekiyorsa
  3. , sadece vardır fazla türü tanımlarını almak için java derleyicisi (JAVA SDK) den tools.jar dahil
  4. vb yöntemler tarif etmek vardır derleme sırasında kullanılır. Ama muhtemelen - Bu kavanoz bağımlılığını eklemek için DON'T GEREKMİYORUM!
  5. roundEnvironment.processingOver()true'dan sonra bile ClassNotFoundException alırsınız.
  6. KISA: Sınıfı kullanmak istediğiniz tüm yerlerde TypeMirror kullanın.

Örnekler: Metod gelen

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; }
  • olsun yöntemi adı: bir sınıftan yöntemler

    • olsun listesi
    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; 
    }
+0

mı ek notEnçevrenin bir kök öğesi? – Sunnyday