SORU
17 Kasım 2009, Salı


Nasıl kasıtlı olarak özel java derleyici bir uyarı iletisi neden?

Bir dış kaynak için sabit olmasını beklerken engelleyen bir sorunu gidermek için çirkin bir geçici hack işlemek üzereyim. Büyük korkutucu bir açıklama ile işaretleme ve FİXMEs bir grup dışında, derleyici bu çıkarmayı unutmayayım diye bir hatırlatma olarak belirgin bir uyarı mesajı atmak isterim. Örneğin, gibi bir şey

[javac] com.foo.Hacky.java:192: warning: FIXME temporary hack to work around library bug, remove me when library is fixed!

Kendi seçtiğim bir mesaj ile kasıtlı derleyici bir uyarı neden bir yolu var mı? O da olmazsa, bir uyarı mesajı basılır alır bu yüzden varolan bir uyarı, soruna neden olan satırı bir dize belki bir mesaj atmak için kodu eklemek için en kolay şey nedir?

EDİT: Artık etiketleri benim için bir şey yapıyor gibi görünmüyor:

/**
 * @deprecated "Temporary hack to work around remote server quirks"
 */
@Deprecated
private void doSomeHackyStuff() { ... }

Güneş tutulması veya derleyici veya çalışma zamanı hataları yok 1.6 javac (ant komut dosyası çalıştıran) ve kesinlikle işlevini çalıştırmadan.

CEVAP
18 Kasım 2009, ÇARŞAMBA


Derleyici tarafından işlenecek olan özel bir açıklama, bir çözüm olduğunu düşünüyorum. Ben sık sık özel ek açıklamalar zamanında şeyler yazmak, ama ben asla derleme zaman bunları kullanmaya çalıştı. Yani, sadece size gereken araçları öğüt verebilirim :

  • Özel bir açıklama yaz. This page ek açıklama yazmak açıklar.
  • Özel açıklama bir uyarı için işleyen bir açıklama işlemci, yazma. Böyle bir açıklama işlemciler çalışan aracı APT denir. this page bir indroduction bulabilirsiniz. APT API neye ihtiyacınız yayarlar uyarılar sağlayacak AnnotationProcessorEnvironment, sanırım.
  • Javac 6, APT Java entegre. Yani, javac komut satırında açıklama işlemci ekleyebilirsiniz. Javac El Kitabı This section özel açıklama işlemci aramak için nasıl anlatacağım.

Eğer bu çözüm gerçekten uygulanabilir olup olmadığını bilmiyorum. Vakit bulduğumda kendim uygulamaya çalışacağım.

Edit

Ben başarıyla benim çözüm uygulanmıştır. Ve bir bonus olarak, java servis sağlayıcı tesis kullanımı kolaylaştırmak için kullandım. Aslında benim çözüm 2 sınıfları içeren bir kavanoz : özel açıklama ve detaylandırma işlemci. Bunu yapmak için, sadece proje sınıf içinde bu kavanoz ekleyin ve istediğiniz her şeyi açıklama ! Bu sorun benim sağ IDE (Eclipse) içinde çalışıyor.

Ek açıklama kod :

package fr.barjak.hack;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER, ElementType.TYPE})
public @interface Hack {

}

İşlemci kodu :

package fr.barjak.hack_processor;

import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;

@SupportedAnnotationTypes("fr.barjak.hack.Hack")
public class Processor extends AbstractProcessor {

    private ProcessingEnvironment env;

    @Override
    public synchronized void init(ProcessingEnvironment pe) {
        this.env = pe;
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        if (!roundEnv.processingOver()) {
            for (TypeElement te : annotations) {
                final Set< ? extends Element> elts = roundEnv.getElementsAnnotatedWith(te);
                for (Element elt : elts) {
                    env.getMessager().printMessage(Kind.WARNING,
                            String.format("%s : thou shalt not hack %s", roundEnv.getRootElements(), elt),
                            elt);
                }
            }
        }
        return true;
    }

}

Bir servis sağlayıcı olarak ortaya çıkan jar etkinleştirmek için, dosya META-INF/services/javax.annotation.processing.Processor kavanoza ekleyin. Bu dosya aşağıdaki metni içermelidir acsıı bir dosya

fr.barjak.hack_processor.Processor

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Arun Kumar

    Arun Kumar

    18 Mart 2010
  • HowcastFoodDrink

    HowcastFoodD

    21 EYLÜL 2010
  • RayperEnglishKnight

    RayperEnglis

    24 Kasım 2008