Java扫描包
在Java中,经常会有 “ 扫描某个包,然后找出全部的 class 的需求。
Spring工具
spring 对这方面提供了支持,直接用即可,前提是,对象要注册到容器内部;
AbstractApplicationContext (上下文)、ConfigurableListableBeanFactory(BeanFactory)等对象均可使用。
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.stereotype.Controller; class BeanFactoryPostProcessorExample implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { //获取带有Controller注解的Bean String[] names= beanFactory.getBeanNamesForAnnotation(Controller.class); } }
Reflections
Reflections这个工具包也很不错,Maven的依赖如下:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>22.0</version> </dependency> <dependency> <groupId>org.reflections</groupId> <artifactId>reflections</artifactId> <version>0.9.10</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.15.0-GA</version> </dependency>
Reflections reflections = new Reflections("com.sea.server.hessian"); Set<Class<?>> hessianImpls = reflections.getTypesAnnotatedWith(Controller.class);
Java扫描包
基本原理,就是直接遍历 target 目录(或者 jar 文件),通过 Class.forname() 构建对象实例。
.class 文件的相对路径,就是全类名。
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!