A nagy sikerre való tekintettel az enum típus bemutatása után következzenek az annotációk, amelyek a generics mellett Java 5 egyik legfontosabb újdonságai. A developer.com körüljárta a témát egészen részletesen M. M. Islam Christy cikkében.
Az annotációk lényege, hogy a kódot könnyebben karbantarthatóvá, illetve hibatűrőbbé tehetjük. Annotációt tudunk tenni osztályokra, konstruktorra, metódusokra illetve akár változókra, mezőkre. Annotációkat használ a JPA (Java Persistence API) is, illetve sok egyéb programkönyvtár: így működik a Swing Application Framework databinding része. Az annotáció tehát jelez valamit a fordító vagy az egyéb keretrendszerek számára, felfoghatjuk a gépnek szóló kommentként is.

Az annotációk többféle célt szolgálnak. Leggyakrabban a marker jellegű annotációkat használjuk, amelyek jeleznek valamit, ezek közül is a Java által lefoglalt annotációkat:

Saját annotációkat is tudunk írni, amelyeknek különféle feladatokat adhatunk, a legegyszerűbb annotáció az alábbi:

public @interface SimpleAnnotation
{
}

De ennek szinte semmi értelme nincs. Az annotációk egyfajta osztályként viselkednek, tehát lehet nekünk metódusuk, amely valamit csinálhat:

public @interface SimpleAnnotation
{
  String givenValue();
}

Ezt fel tudjuk használni egy metódus annotálására, amely során semmi sem fog történni, de képesek leszünk elérni az átadott értéket, ha szükségünk van rá:

@SimpleAnnotation (givenValue="Hello World!")
public void doThis()
{
  System.out.println("Do this!");
}

Ha több paramétert adunk meg, akkor azokat vesszővel tudjuk elválasztani az annotáció neve után megadva. Ha egy saját annotációt nem az összes típushoz használnánk, akkor korlátozni tudjuk annak használhatósági körét a @Target annotációval, amely az annotáció annotációja: