Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to find all classes annotated with @MyAnnotation using a GWT GeneratorContext?

Tags:

gwt

While creating classes using Generators, it's possible to discover all subclasses of a type. You can find this technique for example in the GWT Showcase source (see full code):

JClassType cwType = null;
try {
  cwType = context.getTypeOracle().getType(ContentWidget.class.getName());
} catch (NotFoundException e) {
  logger.log(TreeLogger.ERROR, "Cannot find ContentWidget class", e);
  throw new UnableToCompleteException();
}
JClassType[] types = cwType.getSubtypes();

I would like to do something similar, but instead of extending a class (or implementing an interface)

public class SomeWidget extends ContentWidget { ... }

, could I also do this by annotating Widgets?

@MyAnnotation(...)
public class SomeWidget extends Widget { ... }

And then finding all Widgets that are annotated with @MyAnnotation? I couldn't find a method like JAnnotationType.getAnnotatedTypes(), but maybe I'm just blind?

Note: I was able to make it work with the Google Reflections library, using reflections.getTypesAnnotatedWith(SomeAnnotation.class), but I'd prefer using the GeneratorContext instead, especially because this works a lot better when reloading the app in DevMode.

like image 550
Chris Lercher Avatar asked May 09 '12 17:05

Chris Lercher


1 Answers

Yes - easiest way is to iterate through all types, and check them for the annotation. You might have other rules too (is public, is non-abstract) that should also be done at that time.

for (JClassType type : oracle.getTypes()) {
  MyAnnotation annotation = type.getAnnotation(MyAnnotation.class);
  if (annotation != null && ...) {
    // handle this type
  }
}

The TypeOracle instance can be obtained from the GeneratorContext using context.getTypeOracle().

Note that this will only give you access to types on the source path. That is, only types currently available based on the modules being inherited and <source> tags in use.

like image 185
Colin Alworth Avatar answered Sep 26 '22 02:09

Colin Alworth