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?
Odpowiedz
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:
Dobra aktualizacja odpowiedzi, mimo że wulgaryzmy nie są szczególnie potrzebne. +1 – Vulcan
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
Dzięki, wiedziałem o JAR, ale nie zrobił " t reszty rzeczy. Zaktualizowałem swoją odpowiedź. – tzima
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.
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.
@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
- 1. komunikat ostrzegawczy Firefox
- 2. Komunikat ostrzegawczy Numer wiersza R
- 3. Jak uzyskać komunikat ostrzegawczy przed przekierowaniem strony
- 4. Wiosna Bean działa we własnym wątku
- 5. Komunikat ostrzegawczy w modelu mieszanym lme4
- 6. Komunikat ostrzegawczy systemu Windows 7 UAC powoduje
- 7. Zmienić atrybut funkcji we własnym ciele?
- 8. jak uniknąć "Komunikat ostrzegawczy: NAs wprowadzone przez przymus" w as.numeric()
- 9. zrozumienie, jak elastycznie przeszukuje daty we własnym zakresie
- 10. Komunikat ostrzegawczy "używa lub zastępuje nieaktualny interfejs API" napotkany przy kompilacji kodu
- 11. komunikat ostrzegawczy Nie znaleziono symbolu RTTI podczas używania boost :: iostreams
- 12. Komunikat ostrzegawczy: wiersz wydaje się zawierać osadzone wartości null
- 13. Co oznacza ten komunikat ostrzegawczy, gdy przesyłam moduł do HackageDB?
- 14. SVG komunikat ostrzegawczy plik w edytorze Android Studio
- 15. Komunikat ostrzegawczy podczas otwierania konsoli RStudio lub konsoli R
- 16. Wyświetl komunikat ostrzegawczy i przekierowanie po kliknięciu na zaakceptuj
- 17. Komunikat ostrzegawczy: W `...`: nieprawidłowy poziom czynnika, NA wygenerowany
- 18. Spring 3 MVC: Pokaż komunikat sprawdzania poprawności z własnym weryfikatorem
- 19. Jak nadać elewację Delphi
- 20. Jak nadać sns.clustermap macierz odległości?
- 21. Jak nadać NSText wielu cieniom?
- 22. jak nadać styl etykiecie simple_form?
- 23. Jak uzyskać komunikat ostrzegawczy jako ciąg znaków podczas sprawdzania poprawności XML za pomocą schemaValidate() w PHP?
- 24. Komunikat wyświetlany w AngularJS, gdy obiekt jest pusty we wzmacniaczu
- 25. Przy wywołaniu API "ImageIO.write()" otrzymuję komunikat NullPointerException
- 26. poziom ostrzegawczy nvcc
- 27. Android komunikat ostrzegawczy: Próba odzyskać torbę, która jest nieprawidłowy lub w cyklu
- 28. Jak mogę nadać styl pogrubiony w Androidzie?
- 29. Jak nadać łańcuchom XML pogrubienia, podkreślenia itp.?
- 30. jak nadać niestandardową nazwę plikom wyjściowym hadoopu
Podobny do tego, który zawsze chcę dawać; gdzie dwie metody muszą być nadpisywane razem, podobnie jak równe i hashcode –
@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
Myślę, że to przychodzi z IDE - tutaj eclipse –