2014-04-22 15 views
15

Czy jest możliwe podanie niestandardowego komunikatu ostrzegawczego w moim własnym API, jak poniżej? Czy jest to wiadomość związana z interfejsem Java API lub JVM?Jak nadać komunikat ostrzegawczy we własnym API?

enter image description here

+0

Podobny do tego, który zawsze chcę dawać; gdzie dwie metody muszą być nadpisywane razem, podobnie jak równe i hashcode –

+0

@CanMingir, który pochodzi z kompilatora. Jeśli chcesz mieć niestandardową adnotację: http://stackoverflow.com/questions/1752607/how-to-intentionally-cause-a-ustom-java-compiler-warning-message – Eugene

+0

Myślę, że to przychodzi z IDE - tutaj eclipse –

Odpowiedz

6

Jest to możliwe przy użyciu API kompilatora. Musisz rozszerzyć AbstractProcessor, a następnie upewnić się, że kompilator o tym wie.

Powiedzmy, że nie lubimy programistów, aby przeklinać w kodzie źródłowym. Kiedy więc ktoś zdefiniuje pole o nazwie "shit", chcemy pokazać ostrzeżenie. Oto prosta realizacja:

import java.util.List; 
import java.util.Set; 

import javax.annotation.processing.AbstractProcessor; 
import javax.annotation.processing.RoundEnvironment; 
import javax.annotation.processing.SupportedAnnotationTypes; 
import javax.annotation.processing.SupportedSourceVersion; 
import javax.lang.model.SourceVersion; 
import javax.lang.model.element.Element; 
import javax.lang.model.element.ElementKind; 
import javax.lang.model.element.TypeElement; 
import javax.tools.Diagnostic.Kind; 

@SupportedSourceVersion(SourceVersion.RELEASE_7) 
@SupportedAnnotationTypes("*") 
public class Test extends AbstractProcessor { 
    public int shit; 
    public int foo; 

    @Override 
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { 
     Set<? extends Element> rootElements = roundEnv.getRootElements(); 

     for (Element element : rootElements) { 
      if (element.getKind() == ElementKind.CLASS) { 
       List<? extends Element> classElements = element.getEnclosedElements(); 

       for (Element classElement : classElements) { 
        if (classElement.getKind() == ElementKind.FIELD) { 
         if (classElement.getSimpleName().contentEquals("shit")) { 
          processingEnv.getMessager().printMessage(
           Kind.WARNING, 
           "How dare you to swear in the source code?!", 
           classElement 
          ); 
         } 
        } 
       } 
      } 
     } 

     return false; 
    } 

    public static void main(String[] args) { 
     // 
    } 
} 

Teraz chcemy zastosować taki procesor tylko dla tej samej klasy, bo jest brzydka pole zły zwany też.

Korzystanie z wiersza poleceń:

javac Test.java 
javac -processor Test Test.java 

Musimy najpierw zbudować procesor, a następnie zastosować je podczas kompilacji (w tym przypadku do tego samego pliku).

I to jest wyjście otrzymujemy:

Test.java:17: warning: How dare you to swear in the source code?! 
    public int shit; 
     ^
1 warning 

mieć taki sam ostrzeżenie w Eclipse lub innego IDE, to należy zmienić ustawienia kompilatora więc używa ten niestandardowy procesor.

Aktualizacja W komentarzach, kapep wysłany link na jak ustawić procesor niestandardowego w Eclipse: http://kerebus.com/2011/02/using-java-6-processors-in-eclipse/


Tak dla przypomnienia: Dokładnie to samo ostrzeżenie może być osiągnięty poprzez wdrożenie interfejsu zamykane :

import java.io.Closeable; 
import java.io.IOException; 

public class Test implements Closeable { 
    @Override 
    public void close() throws IOException { 
     // TODO Auto-generated method stub 
    } 

    public static void main(String[] args) { 
     new Test(); 
    } 
} 

I widzisz ten sam ostrzeżenie:

enter image description here

+0

Dobra aktualizacja odpowiedzi, mimo że wulgaryzmy nie są szczególnie potrzebne. +1 – Vulcan

+1

Ustawienie procesora w czasie zaćmienia jest nieco bardziej skomplikowane. Musisz utworzyć słoik z jakimś zasobem meta i aktywować kilka ustawień. Oto samouczek: http://kerebus.com/2011/02/using-java-6-processors-in-eclipse/ (nadal ważne dla nowszych wersji java) – Kapep

+0

Dzięki, wiedziałem o JAR, ale nie zrobił " t reszty rzeczy. Zaktualizowałem swoją odpowiedź. – tzima

0

Chciałbym wierzyć, że to jest związane z IDE Eclipse, można ewentualnie napisać plugin, który wyświetla ostrzeżenia jak to.

Na przykład, gdy używasz metody, która ma adnotację "@Deprecated", ide automatycznie informuje programistę, że ta metoda jest nieaktualna.

1

Można tworzyć ostrzeżenia, notatki, błędy i inne komunikaty diagnostyczne w ten sposób, korzystając z annotation processor. Jest to apiap kompilatora zintegrowany z JDK. Pozwala analizować strukturę konspektu kodu źródłowego. Pomimo nazwy nie musisz obsługiwać adnotacji podczas przetwarzania kodu. Wiadomości są tworzone przy użyciu klasy Messager. Jeśli podasz element, zostanie on zaznaczony, a wiadomość pojawi się obok niego w edytorze kodu źródłowego.

Nie będzie można wyświetlić komunikatu na elementach wewnątrz metod lub wyrażeń, tylko w przypadku deklaracji typu, właściwości, metod lub parametrów. Możliwe jest dodatkowo przeanalizowanie treści metody i wygenerowanie wiadomości na podstawie zawartości przy użyciu innych narzędzi, ale o ile wiem, nie można wyświetlić komunikatu na rzeczywistym lokalnym elemencie. Nadal można wyświetlić komunikat w metodzie załączania lub nie określać żadnego elementu i pokazać go w dzienniku IDE.

IDE również musi to wspierać. Wiem, że Eclipse i NetBeans obsługują komunikaty generowane przez procesory adnotacji, ale prawdopodobnie istnieją inne nowoczesne IDE, które również to robią. Jeśli potrzebujesz więcej funkcji, takich jak wiadomości na elementach w treści metod lub funkcji szybkiej poprawki, jak pokazano w przykładzie, domyślam się, że musisz utworzyć wtyczkę dla IDE.

+0

@Vulcan Zastanowiłem się nad dodaniem przykładu, ale wydawało mi się to nieco poza zasięgiem, ponieważ pytanie jest dość szerokie, więc starałem się po prostu pokazać, co jest możliwe. Cóż, teraz druga odpowiedź została zaktualizowana na dobry przykład, myślę, że to wystarczy. – Kapep

Powiązane problemy