Performance Notes
The process of loading attributes for a class is a (relatively) time-consuming process, as it involves some dynamic linking in the form of inheritable attributes, a lot of reflection and so on. However, once loaded the attributes are cached, so repeated access to them are fast. But despite this the process of finding one attribute of a given type or such operations does involve some iteration of HashSets that runs in linear time in the number of attributes associated with the program element, and you should avoid accessing attributes in your innermost loops if you can avoid it. For example, instead of:
Class myClass = ...;
for (int i = 0; i < 10000; i++) {
if (Attributes.hasAttributeType (myClass, MyAttribute.class)) {
doThis(myClass);
} else {
doThat(myClass);
}
}
do:
Class myClass = ...;
boolean shouldDoThis = Attributes.hasAttributeType (myClass, MyAttribute.class);
for (int i = 0; i < 10000; i++) {
if (shouldDoThis) {
doThis(myClass);
} else {
doThat(myClass);
}
}
if the loop should run at maximum speed.