Java - loading annotated classes

老子叫甜甜 提交于 2019-11-30 06:03:39

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.

gersonZaragocin

It can be done with techniques that check the filesystem because it is more a classloader issue than a reflection one. Check this: Can you find all classes in a package using reflection?.

If you can check all the class files that exists in a directory, you can easily get the corresponding class using this method

Class<?> klass = Class.forName(className)

To know if a class is annotated or not is a reflection issue. Getting the annotations used in a class is done this way:

Annotation[] annotations = klass.getAnnotations();

Be sure to define your custom annotation with a retention policy type visible at run time.

@Retention(RetentionPolicy.RUNTIME) 

This article is a good resource for more info on that: http://tutorials.jenkov.com/java-reflection/annotations.html.

Vitaliy

If you have Spring(3rd party, sorry :-)), use the org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider

A code usage example can be found in this SO question

It all depends on what kind of requirement you have for annotation.

Like e.g. @EJB : This annotation is designed so that container will identify and do EJB Specific work which requires scanning through files and then finding such classes.

However if your requirement is only to enable specific functionality based on annotation then you can do it using java reflection only

e.g. @NotNull : This annotation is designed in JSR 303 to verify that Annotated element is not null. This functionality can be easily implemented at run time using reflection API

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!