I understand that Annotations aren't directly used in compiled Java programs outside of access through the reflection API or some other means.
Annotations, a form of metadata, provide data about a program that is
not part of the program itself. Annotations have no direct effect on
the operation of the code they annotate.
But my question is, do annotations improve the performance of how the application is executed, from JVM viewpoint? Or is it more of a clean and disciplined approach for maintaining mapping/types in your application?
Spring/Hibernate are some of the good examples where annotation-based processing is heavily exploited, but I would like to understand whether this is for simplicity (which is very nice) or also for improved performance win.
Best Answer
Annotations do not have a performance win... unless they are used by a code generation step to inject code for you (article).
Where Annotations do have a definite win is with the concept of auto-configuration, which is the first killer feature exploited by Spring and similar frameworks.
Annotations improve over the prior legacy solutions:
javadoc
tool to do what annotations do now. The chief downside is that javadoc markers cannot be reflected at runtime, and you have to use another tool to preprocess your source code before compiling.There may have been others, but these are the three legacy solutions I am personally familiar with. Annotations are a set of tools that can enable solutions without being overly invasive to your code.
One more use that popped in my head that annotations replaces was for reflection based decision making--most notably with testing. JUnit used to require you to extend a
TestCase
base class and name all your test methods with the prefixtest
.Example legacy JUnit test:
All the assert methods were defined in the base class, and if your test prefix was misspelled the test wasn't run. I.e.
tsetSomethingCool()
wouldn't have a compile error, but also wouldn't run.Annotations and static imports handled both cases where your unit tests weren't constrained by these conventions anymore. The annotations fixed the problem where your method was misnamed, so your compiler will fail if you misspell the annotation name. They also made the pre/post test functions more flexible like that. Static imports fixed the problem of the
assert
functions being in a base class, so you can access them as if they were part of your test.Example modern JUnit test:
NOTE: sorry for the math joke in both the failing tests... Code was pulled from memory, so some changes would likely be needed to compile.