https://en.wikipedia.org/wiki/Plain_old_Java_object
No, la questione non è quanti dati ha un oggetto.
Generalmente le scopre e utilizza tramite reflection.
Guarda, se non hai mai fatto questa prova, fai così: definisci una nuova annotation Autore che abbia il value() String in modo da poterla usare così:
codice:@Autore("jabjoint") public class UnaClasse { }
Attenzione, la annotation deve avere la retention policy a RUNTIME, altrimenti non viene esposta a runtime! E il Target deve essere almeno TYPE (dato che la usi su un tipo).
Poi fai un classico main altrove. Parti da UnaClasse.class, questo è il class-literal dell'oggetto Class<UnaClasse>. Su questo fai un getAnnotation(Autore.class). Ti dà o null o l'oggetto della annotation (se hai fatto giusto, ovviamente l'oggetto).
L'annotation è come se fosse una interface "speciale" ma a runtime ottieni un oggetto che la implementa. E poi stampi il value()
Se hai dubbi, chiedi. Ma se capisci questo, capisci il 90% delle annotation.
Sì ma devi conoscere molto bene anche il resto. Tutte le feature di Java 5 (compresi e soprattutto i generics). Più multi-threading/concorrenza e possibilmente anche le feature di Java 8 (lambda expression, method reference, Stream API, Date-Time API).
Se io ti chiedessi cosa è un bounded wildcard o la differenza tra ArrayList<?> e ArrayList<Object>, dovresti saper rispondere.
E anche perché un ArrayList<String> NON è assegnabile ad un ArrayList<Object> (questa è proprio la base fondamentale dei generics).