Adnotacje Java

114

Jaki jest cel adnotacji w Javie? Mam ten niewyraźny pomysł, że są gdzieś pomiędzy komentarzem a rzeczywistym kodem. Czy wpływają na program w czasie wykonywania?

Jakie są ich typowe zastosowania?

Czy są unikalne dla języka Java? Czy istnieje odpowiednik C ++?

Lehane
źródło
9
Za pomocą adnotacji możesz robić naprawdę niegodziwe rzeczy. Na przykład, jeśli znasz Spring Framework i ich adnotację @Transactional, która rozpoczyna transakcję przed wywołaniem metody i wycofywaniem zmian w przypadku wyjątku / błędu i zatwierdza po udanej transakcji. Całkowicie wspiera zasadę SOC (rozdzielenie obaw). Bardzo czysto ! Zasady Java! :-)
1
To dla mnie wygląda na 3 pytania. Drugi sam w sobie jest zbyt szeroki.
Raedwald,
Wszystkie adnotacje według składni wyglądają jak interfejsy. Skąd więc kompilator lub JVM wie, jaki jest jego cel? Załóżmy, że jeśli weźmiemy @ Override -> sprawdza, czy metoda została poprawnie zastąpiona, czy nie, @ Transactional, jak wyjaśniono powyżej, wykonuje operacje związane z transakcją. Gdzie możemy znaleźć definicję / logikę dla wszystkich tych adnotacji?
Paramesh Korrakuti

Odpowiedzi:

80

Adnotacje są używane głównie przez kod, który sprawdza inny kod. Są często używane do modyfikowania (np. Dekorowania lub pakowania) istniejących klas w czasie wykonywania, aby zmienić ich zachowanie. Struktury, takie jak JUnit i Hibernate, używają adnotacji, aby zminimalizować ilość kodu, który trzeba napisać samodzielnie, aby korzystać z tych struktur.

Oracle ma dobre wyjaśnienie tego pojęcia i jego znaczenia w Javie na swojej stronie.

Anders Sandvig
źródło
17

Czy są one unikalne dla języka Java, czy istnieje odpowiednik w C ++?

Nie, ale VB i C # mają atrybuty, które są tym samym.

Ich zastosowanie jest dość zróżnicowane. Jeden typowy przykład języka Java @Overridenie ma wpływu na kod, ale może zostać użyty przez kompilator do wygenerowania ostrzeżenia (lub błędu), jeśli dekorowana metoda w rzeczywistości nie przesłania innej metody. Podobnie metody można oznaczyć jako przestarzałe.

Potem jest refleksja. Kiedy odzwierciedlasz typ klasy w swoim kodzie, możesz uzyskać dostęp do atrybutów i działać zgodnie z znalezionymi tam informacjami. Nie znam żadnych przykładów w Javie, ale w .NET jest to używane przez kompilator do generowania (de) informacji o serializacji dla klas, określania układu pamięci struktur i deklarowania importu funkcji ze starszych bibliotek (między innymi). Kontrolują również sposób działania projektanta formularzy IDE.

/ EDIT: Atrybuty w klasach są porównywalne z interfejsami tagów (jak Serializable w Javie). Jednak wytyczne dotyczące kodowania .NET mówią, aby nie używać interfejsów znaczników. Ponadto działają tylko na poziomie klasy, a nie na poziomie metody.

Konrad Rudolph
źródło
13

Anders podaje dobre podsumowanie, a oto przykład adnotacji JUnit

@Test(expected=IOException.class)
public void flatfileMissing() throws IOException {
    readFlatFile("testfiles"+separator+"flatfile_doesnotexist.dat");
}

W tym miejscu @Testadnotacja mówi JUnit, że flatfileMissingmetoda jest testem, który powinien zostać wykonany i że oczekiwany wynik jest wyrzucony IOException. Dlatego po uruchomieniu testów ta metoda zostanie wywołana, a test zakończy się pomyślnie lub zakończy się niepowodzeniem w zależności od tego, czy IOExceptionzostanie zgłoszony.

Eli Courtwright
źródło
7

Java ma również narzędzie do przetwarzania adnotacji (apt), w którym nie tylko tworzysz adnotacje, ale także decydujesz, jak te adnotacje mają działać w kodzie źródłowym.

Oto wprowadzenie.

pek
źródło
4

Aby zobaczyć fajne rzeczy, które możesz zrobić z adnotacjami, sprawdź moje adnotacje JavaBean i procesor adnotacji .

Świetnie nadają się do generowania kodu, dodawania dodatkowych walidacji podczas kompilacji, a także używam ich do obsługi komunikatów o błędach (jeszcze niepublikowane - trzeba to wyjaśnić z szefami ...).

Scott Stanchfield
źródło
1

Zgodnie z definicją dosłowną adnotacja dodaje uwagi do elementu. Podobnie adnotacje Java to tagi, które wstawiamy do kodu źródłowego w celu dostarczenia dodatkowych informacji o kodzie. Adnotacje Java wiążą informacje z elementem programu z adnotacjami. Oprócz adnotacji w języku Java, programy w języku Java zawierają wiele nieformalnej dokumentacji, która jest zwykle zawarta w komentarzach w pliku kodu źródłowego. Ale adnotacje w języku Java różnią się od komentarzy, które bezpośrednio opisują elementy programu przy użyciu typów adnotacji do opisania formy adnotacji. Adnotacje Java przedstawiają informacje w standardowy i ustrukturyzowany sposób, tak aby można je było łatwo wykorzystać przez narzędzia przetwarzające.

Aby zapoznać się ze szczegółami, istnieje ładny samouczek dotyczący adnotacji w języku Java

Krishan
źródło
0

Adnotacje, jeśli chodzi o EJB, są znane jako wybór niejawnego podejścia do oprogramowania pośredniego zamiast jawnego podejścia do oprogramowania pośredniego, kiedy używasz adnotacji, dostosowujesz dokładnie to, czego potrzebujesz od API, na przykład musisz wywołać metodę transakcji dla przelewu bankowego : bez użycia adnotacji: kod będzie

transfer(Account account1, Account account2, long amount)    
{
   // 1: Call middleware API to perform a security check
   // 2: Call middleware API to start a transaction
   // 3: Call middleware API to load rows from the database
   // 4: Subtract the balance from one account, add to the other
   // 5: Call middleware API to store rows in the database
   // 6: Call middleware API to end the transaction
}

podczas korzystania z adnotacji, twój kod nie zawiera uciążliwych wywołań API do korzystania z usług pośrednictwa. Kod jest czysty i skoncentrowany na logice biznesowej

transfer(Account account1, Account account2, long amount) 
{
   // 1: Subtract the balance from one account, add to the other
}
Żniwiarz
źródło