Java annotations provide a way to decorate programs with additional metadata information without directly affecting program semantics. Annotations can be read from source code, class files, or reflectively at runtime. The Java Metadata Facility specification defines how annotations can be declared and used. Annotations allow for more declarative programming by specifying what to do rather than how to do it.