From the Java doc:
Annotations are to be recorded in the class file by the compiler but need not be retained by the VM at run time.
Annotations are to be recorded in the class file by the compiler and retained by the VM at run time, so they may be read reflectively.
Annotations are to be discarded by the compiler.
I understand the usages of RUNTIME (in order to use annotation with reflection) and CLASS (for the compiler) but I don’t understand when it can be usefull to use
Can you explain?
Things like @SuppressWarnings, @Override are annotations used by the compiler – not needed at runtime. For those RetentionPolicy.SOURCE would make sense. Also annotations can be used to generate code (look at Spring ROO) – such annotation are also not required at run time.