Search code examples
javaannotationsclassloader

Java - loading annotated classes


I know there are incredible set of tools for loading plugin classes in java, but today an idea came to my mind.

What if I have a bunch of annotated and un-annotated classes in package "org.home.junk" (annotated with annotation "@AnnotatedClass") and those classes have annotated methods with say annotation "@AnnotatedMethod".

First question: can I at run-time get an array/collection of all the classes in that specific package, so that I could check which one's are annotated and create an instance of them. (I am aware however how to check if Some.class has annotations courtesy of this guide: http://isagoksu.com/2009/development/java/creating-custom-annotations-and-making-use-of-them/)

Second question: - If I can do what I'd like in first question - what would be the most political way to do this?

I believe it is possible, as I understand JUnit loads test-case classes in some similar manner.

Also it would be cool if this could be done with minimal third party libraries and such, again - if it's possible :)


Solution

  • First answer: Take a look at this project.

    Reflections reflections = new Reflections("org.home.junk");
    Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(javax.persistence.Entity.class);
    

    It returns all the classes from org.home.junk annotated with javax.persistence.Entity annotation.

    Second Answer: To create new instance of above classes you can do this

    for (Class<?> clazz : annotated) {
        final Object newInstance = clazz.newInstance();
    }
    

    Hope this answers everything.