Anotácie Java Dotazy na rozhovor (+ odpovede)

Tento článok je súčasťou série: • Otázky týkajúce sa rozhovorov o zbierkach Java

• Dotazy týkajúce sa systému typu Java

• Otázky týkajúce sa rozhovorov o súbehu Java (+ odpovede)

• Otázky týkajúce sa štruktúry triedy Java a inicializácie

• Otázky týkajúce sa rozhovoru s Java 8 (+ odpovede)

• Správa pamäte v otázkach týkajúcich sa rozhovorov Java (+ odpovede)

• Java Generics Interview otázky (+ odpovede)

• Otázky týkajúce sa riadenia toku Java (+ odpovede)

• Otázky týkajúce sa rozhovorov o výnimkách jazyka Java (+ odpovede)

• Anotácie Java Dotazy na rozhovor (+ odpovede) (aktuálny článok) • Najlepšie otázky týkajúce sa jarného rámcového rozhovoru

1. Úvod

Anotácie existujú už od Javy 5 a v dnešnej dobe sú to všadeprítomné programovacie konštrukty, ktoré umožňujú obohatenie kódu.

V tomto článku preskúmame niektoré otázky týkajúce sa anotácií; ktoré sa často pýtajú na technických pohovoroch a prípadne; implementujeme príklady, aby sme lepšie pochopili ich odpovede.

2. Otázky

Q1. Čo sú anotácie? Aké sú ich typické prípady použitia?

Anotácie sú metadáta viazané na prvky zdrojového kódu programu a nemajú žiadny vplyv na činnosť kódu, ktorý prevádzkujú.

Ich typické prípady použitia sú:

  • Informácie pre prekladateľa - s anotáciami môže kompilátor zistiť chyby alebo potlačiť varovania
  • Spracovanie v čase kompilácie a nasadenia - softvérové ​​nástroje môžu spracovávať anotácie a generovať kód, konfiguračné súbory atď.
  • Spracovanie za behu - anotácie je možné preskúmať za behu a prispôsobiť tak správanie programu

Q2. Popíšte niektoré užitočné poznámky zo štandardnej knižnice.

V dokumente je niekoľko anotácií java.lang a java.lang.annotácia Medzi najbežnejšie balíčky patria okrem iného:

  • @Override - označuje, že metóda je určená na prepísanie prvku deklarovaného v nadtriede. Ak sa nepodarí správne prepísať metódu, kompilátor vydá chybu
  • @ Zastarané - označuje, že prvok je zastaraný a nemal by sa používať. Kompilátor vydá varovanie, ak program použije metódu, triedu alebo pole označené touto anotáciou
  • @SuppressWarnings - povie prekladaču, aby potlačil konkrétne varovania. Najčastejšie sa používa pri prepojení so starým kódom napísaným pred objavením generík
  • @Funkčné rozhranie - zavedené v prostredí Java 8, naznačuje, že deklarácia typu je funkčné rozhranie a ktorého implementáciu je možné zabezpečiť pomocou výrazu Lambda

Q3. Ako môžete vytvoriť anotáciu?

Anotácie sú formou rozhrania, v ktorom sa nachádza kľúčové slovo rozhranie pred ním je @, a ktorého telo obsahuje prvok typu anotácie vyhlásenia, ktoré vyzerajú veľmi podobne ako metódy:

public @interface SimpleAnnotation {String value (); typy int [] (); }

Po definovaní anotácie ju môže yon začať používať prostredníctvom vášho kódu:

@SimpleAnnotation (value = "an element", types = 1) public class Element {@SimpleAnnotation (value = "an attribute", types = {1, 2}) public Element nextElement; }

Upozorňujeme, že pri zadávaní viacerých hodnôt pre prvky poľa ich musíte uviesť v zátvorkách.

Predvolené hodnoty môžu byť poskytnuté, pokiaľ sú konštantnými výrazmi pre kompilátor:

public @interface SimpleAnnotation {Reťazcová hodnota () predvolené "Toto je prvok"; int [] typy () predvolené {1, 2, 3}; }

Teraz môžete použiť anotáciu bez týchto prvkov:

@SimpleAnnotation verejná trieda Element {// ...}

Alebo iba niektoré z nich:

@SimpleAnnotation (value = "atribút") public Element nextElement;

Q4. Aké typy objektov je možné vrátiť z vyhlásenia metódy anotácie?

Návratový typ musí byť primitívny, String, Trieda, Enumalebo pole jedného z predchádzajúcich typov. V opačnom prípade kompilátor vyhodí chybu.

Tu je príklad kódu, ktorý úspešne dodržiava tento princíp:

enum Complexity {LOW, HIGH} public @interface ComplexAnnotation {Class value (); typy int [] (); Zložitosť zložitosť (); }

Nasledujúci príklad sa odvtedy nepodarí zostaviť Objekt nie je platný typ vrátenia:

public @interface FailingAnnotation {zložitosť objektu (); }

Q5. Ktoré prvky programu je možné anotovať?

Poznámky možno v celom zdrojovom kóde použiť na niekoľkých miestach. Môžu byť použité na deklarácie tried, konštruktorov a polí:

Verejná trieda @SimpleAnnotation Použiť {@SimpleAnnotation private String aField; @SimpleAnnotation public Použiť () {// ...}}

Metódy a ich parametre:

@SimpleAnnotation public void aMethod (@SimpleAnnotation String param) {// ...}

Lokálne premenné vrátane premenných slučky a zdrojov:

@SimpleAnnotation int i = 10; for (@SimpleAnnotation int j = 0; j <i; j ++) {// ...} try (@SimpleAnnotation FileWriter writer = getWriter ()) {// ...} catch (Exception ex) {// .. .}

Ďalšie typy anotácií:

@SimpleAnnotation public @interface ComplexAnnotation {// ...}

A dokonca aj balíčky prostredníctvom balíček-info.java spis:

Balíček @PackageAnnotation com.baeldung.interview.annotations;

Od verzie Java 8 sa dajú použiť aj na server použitie typov. Aby to fungovalo, musí anotácia uvádzať znak @ Cieľ anotácia s hodnotou ElementType.USE:

@ Cieľ (ElementType.TYPE_USE) verejné @ rozhranie SimpleAnnotation {// ...}

Teraz možno anotáciu použiť na vytvorenie inštancie triedy:

new @SimpleAnnotation Apply ();

Typ odliatkov:

aString = (@SimpleAnnotation String) niečo;

Doložka o implementácii:

verejná trieda SimpleList implementuje zoznam @SimpleAnnotation {// ...}

A hodí doložka:

void aMethod () vyvolá výnimku @SimpleAnnotation {// ...}

Q6. Existuje spôsob, ako obmedziť prvky, v ktorých je možné použiť anotáciu?

Áno @ Cieľ na tento účel možno použiť anotáciu. Ak sa pokúsime použiť anotáciu v kontexte, kde ju nie je možné použiť, kompilátor vydá chybu.

Tu je príklad na obmedzenie používania súboru @SimpleAnnotation anotácia iba k poľným vyhláseniam:

@ Cieľ (ElementType.FIELD) verejné @ rozhranie SimpleAnnotation {// ...}

Ak chceme zaistiť, aby bolo použiteľné vo viacerých kontextoch, môžeme odovzdať viac konštánt:

@Target ({ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE})

Môžeme dokonca vytvoriť anotáciu, aby ju nebolo možné použiť na anotáciu čohokoľvek. To sa môže hodiť, keď sú deklarované typy určené výhradne na použitie ako typ člena v komplexných anotáciách:

@Target ({}) public @interface NoTargetAnnotation {// ...}

Q7. Čo sú meta-anotácie?

Sú anotácie použiteľné pre iné anotácie.

Všetky anotácie, ktoré nie sú označené @ Cieľ, alebo sú ním označené, ale zahŕňajú ANNOTATION_TYPE konštanty sú aj metaanotácie:

@ Cieľ (ElementType.ANNOTATION_TYPE) verejné @ rozhranie SimpleAnnotation {// ...}

Q8. Čo sú opakujúce sa poznámky?

Jedná sa o anotácie, ktoré možno na deklaráciu toho istého prvku použiť viackrát.

Z dôvodu kompatibility, pretože táto funkcia bola predstavená v prostredí Java 8, sú opakujúce sa anotácie uložené v a anotácia kontajnera ktorý je automaticky generovaný kompilátorom Java. Aby to kompilátor urobil, musí ich deklarovať dvoma krokmi.

Najskôr musíme deklarovať opakovateľnú anotáciu:

@Repeatable (Schedules.class) public @interface Schedule {String time () predvolené "ráno"; }

Potom definujeme obsahujúcu anotáciu s povinným hodnotu prvok a ktorého typ musí byť pole typu opakovateľnej anotácie:

public @interface Schedules {Schedule [] value (); }

Teraz môžeme program @Schedule použiť viackrát:

@Schedule @Schedule (time = "odpoledne") @Schedule (time = "night") void scheduledMethod () {// ...}

Q9. Ako môžete načítať anotácie? Ako to súvisí s jeho politikou zadržiavania?

Na načítanie anotácií môžete použiť Reflection API alebo anotačný procesor.

The @ Zadržanie anotácia a jej Retenčná politika parameter ovplyvňuje, ako ich môžete načítať. V systéme sú tri konštanty Retenčná politika enum:

  • RetentionPolicy.SOURCE - vytvorí anotáciu, ktorú má kompilátor zahodiť, ale anotačné procesory ju môžu prečítať
  • RetentionPolicy.CLASS - označuje, že anotácia je pridaná do súboru triedy, ale nie je prístupná odrazom
  • RetentionPolicy.RUNTIME –Anotácie sú zaznamenané v súbore triedy kompilátorom a uchované JVM za behu, aby ich bolo možné čítať reflexne

Tu je príklad kódu na vytvorenie anotácie, ktorú je možné prečítať za behu programu:

@Retention (RetentionPolicy.RUNTIME) public @interface Description {String value (); }

Teraz je možné poznámky získať pomocou reflexie:

Description description = AnnotatedClass.class.getAnnotation (Description.class); System.out.println (description.value ());

S procesorom anotácií je možné pracovať RetentionPolicy.SOURCE, je to popísané v článku Spracovanie anotácií Java a vytvorenie Builderu.

RetentionPolicy.CLASS je použiteľné, keď píšete syntaktický analyzátor bajtových kódov Java.

Q10. Bude sa kompilovať nasledujúci kód?

@Target ({ElementType.FIELD, ElementType.TYPE, ElementType.FIELD}) public @interface TestAnnotation {int [] hodnota () predvolené {}; }

Nie. Je to chyba kompilácie, ak sa rovnaká konštanta enum objaví viac ako raz v an @ Cieľ anotácia.

Odstránenie duplicitnej konštanty spôsobí úspešné zostavenie kódu:

@Target ({ElementType.FIELD, ElementType.TYPE})

Q11. Je možné rozšíriť anotácie?

Nie. Poznámky sa vždy rozširujú java.lang.annotation.Annotation, ako je uvedené v špecifikácii jazyka Java.

Ak sa pokúsime použiť predlžuje klauzula v deklarácii anotácie, dostaneme chybu kompilácie:

public @interface AnAnnotation rozširuje OtherAnnotation {// Chyba kompilácie}

Záver

V tomto článku sme sa venovali niektorým z často kladených otázok týkajúcich sa anotácií, ktoré sa vyskytujú v technických rozhovoroch pre vývojárov Java. Toto v žiadnom prípade nie je vyčerpávajúci zoznam a mal by sa považovať iba za začiatok ďalšieho výskumu.

My v Baeldungu vám prajeme úspech v akýchkoľvek nadchádzajúcich rozhovoroch.

Ďalšie » Najlepšie otázky týkajúce sa jarného rámcového rozhovoru « Predchádzajúce otázky týkajúce sa výnimiek z jazyka Java (+ odpovede)

$config[zx-auto] not found$config[zx-overlay] not found