2011-07-13 10 views
23

Bazı çalışma zamanı kablolamalarını yapacağım yeni bir açıklama oluşturmaya çalışıyorum, ancak, bir dizi nedenden dolayı, kablolarımın derleme zamanında doğrulanmasını istiyorum bazı ilkel çekler ile başarılı olacak. ParticularType: Özel bir Soyut İşlemci oluşturma ve Eclipse ile entegrasyon

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface CustomAnnotation{ 
} 

Şimdi derleme zamanında doğrulama çeşit yapmak istiyorum

gibi CustomAnnotation belirli bir türdeki olduğunu annotates bu alanı kontrol edin:

varsayalım ben yeni bir ek açıklama oluşturun. Ben Java 6 çalışıyorum, bu yüzden bir AbstractProcessor yarattı: buldum bazı talimatlara dayalı, Sonra

@SupportedAnnotationTypes("com.example.CustomAnnotation") 
public class CompileTimeAnnotationProcessor extends AbstractProcessor { 

    @Override 
    public boolean process(Set<? extends TypeElement> annotations, 
          RoundEnvironment roundEnv) { 
     Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(CustomAnnotation.class); 
     for(Element e : elements){ 
      if(!e.getClass().equals(ParticularType.class)){ 
       processingEnv.getMessager().printMessage(Kind.ERROR, 
        "@CustomAnnotation annotated fields must be of type ParticularType"); 
      } 
     } 
     return true; 
    } 

} 

, bir klasör META-INF/services oluşturulan ve içeriği ile bir dosyayı javax.annotation.processing.Processor yarattı:

com.example.CompileTimeAnnotationProcessor 

Sonra projeyi bir kavanoz olarak ihraç ettim. "Açıklama işlemeyi etkinleştir":> Ek Açıklama İşleme -

  • Seti Java derleyicisi şu şekildedir: Eclipse proje özelliklerini konfigüre

    public class TestClass { 
        @CustomAnnotation 
        private String bar; // not `ParticularType` 
    } 
    

    : Başka bir projede

    , ben basit bir test sınıfı inşa ve "Editörde işlemeyi etkinleştirme"
  • Dışa aktarılmış jar'ımı dahil etmek ve tam olarak nitelenmiş sınıfımın geldiği ilerlemeyi kontrol etmek için Java Derleyici -> Detaylandırma İşleme -> Fabrika Yolu'nu ayarlayın.

Projeyi yeniden oluşturmak için "Uygula" ve Eclipse komutlarını tıklattım, tamama vurdum - ancak ek açıklama işlemcisine rağmen hiçbir hata atılmıyor.

Nerede hata yaptım?


Ben

@CustomAnnotation açıklamalı alanlar tip ParticularType olmalıdır javac çıkışı ile

javac -classpath "..\bin;path\to\tools.jar" -processorpath ..\bin -processor com.example.CompileTimeAnnotationProcessor com\test\TestClass.java 

olarak

+0

İlk olarak, ek açıklama işlemcisi Eclipse dışında javac ile çalışır mı? – antlersoft

+0

@antlersoft: evet, düz javac ile Eclipse dışında çalışır (düzenlemeler bunu yansıtır). –

+4

Eclipse'de Hata Günlüğünü kontrol ettiniz mi (Göremiyorsanız, Pencere> Görünümü Göster> Hata Günlüğü)? Bir açıklama işlemcisi başarısız olduğunda, bir hatayla açılan bir iletişim kutusu açılmayabilir, ancak hata günlüğünde bir hata görüntülenir. Ayrıca, işlemcinizde Messager.printMessage() 'i türetmek için işlemcinizde hata ayıklamasında da görüldüğü gibi, Eclipse'de işlemcinizde hata ayıklamaya çalışabilirsiniz. – prunge

cevap

17

hataları sahip olmak kullanarak bu gösterilmesini koştu editör, Element neden t O hata, printMessage işlevinde etiketlenmelidir. Yukarıdaki örnekte, bu derleme zamanı denetiminin kullanması gerektiği anlamına gelir:

processingEnv.getMessager().printMessage(Kind.ERROR, 
    "@CustomAnnotation annotated fields must be of type ParticularType", 
    e); // note we explicitly pass the element "e" as the location of the error 
+1

Bir süreyi anlamak için bana biraz zaman ayırdı ve geleceğin izleyicileri için bir not olarak, yazarın "processingEnv.getMessager(). PrintMessage (") ile doğru çözümün oyu arasındaki fark, üçüncü bir argümanın "e" geçmesidir. – corgrath

+0

Çözüm için teşekkürler: Ek açıklama notumu/bin alanına atmak üzereydim, ama şimdi harika çalışıyor! –